1

matplotlibを使用してプロットしようとすると、この恐ろしい大規模なエラーが発生します。

Traceback (most recent call last):
  File "24oct_specanal.py", line 90, in <module>
    main()
  File "24oct_specanal.py", line 83, in main
    plt.plot(Svar,Sav)
  File "/usr/lib64/python2.6/site-packages/matplotlib/pyplot.py", line 2458, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 3849, in plot
    self.add_line(line)
  File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 1443, in add_line
    self._update_line_limits(line)
  File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 1451, in _update_line_limits
    p = line.get_path()
  File "/usr/lib64/python2.6/site-packages/matplotlib/lines.py", line 644, in get_path
    self.recache()
  File "/usr/lib64/python2.6/site-packages/matplotlib/lines.py", line 392, in recache
    x = np.asarray(xconv, np.float_)
  File "/usr/lib64/python2.6/site-packages/numpy/core/numeric.py", line 235, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

これは私が使用しているコードです:

import numpy as np
import numpy.linalg
import random
import matplotlib.pyplot as plt
import pylab
from scipy.optimize import curve_fit
from array import array

def makeAImatrix(n):

    A=np.zeros((n,n))
    I=np.ones((n))
    for i in range(0,n):
        for j in range(i+1,n):
            A[j,i]=random.random()
    for i in range(0,n):
        for j in range(i+1,n):
                A[i,j] = A[j,i]
    for i in range(n):
        A[i,i]=1
    return (A, I)

def main():
    n=5 #number of species
    t=1 # number of matrices to check
    Aflat = []
    Aflatlist = [] #list of matrices
    Aflatav = []
    Aflatvar = []
    Aflatskew = []
    remspec = []
    Afreeze = [] #this is a LIST OF VECTORS that stores the vector corresponding to each extinct species as
                  #it is taken out. it is NOT the same as the original A matrix as it is only
                  #coherant in one direction. it is also NOT A SQUARE.
    Sex = [] # (Species extinct) this is a vector that corresponds to the Afreeze matrix. if a species is extinct then
                #the value stored here will be -1. 
    Sav = [] # (Species average) The average value of the A cooefficiants for each species
    Svar = [] # (Species variance)

    for k in range (0,t):
        allpos = 0
        A, I = makeAImatrix(n)
        while allpos !=1: #while all solutions are not positive

            x = numpy.linalg.solve(A,I)
            if any(t<0 for t in x): #if any of the solutions in x are negative
                p=np.where(x==min(x)) # find the most negative solution, p is the position

                #now store the A coefficiants of the extinct species in the Afreeze list
                Afreeze.append(A[p])
                Sex.append(-1) #given -1 value as species is extinct.

                x=np.delete(x, p, 0)
                A=np.delete(A, p, 0)
                A=np.delete(A, p, 1)
                I=np.delete(I, p, 0)

            else: 
                allpos = 1 #set allpos to one so loop is broken
        l=len(x)

        #now fill Afreeze and Sex with the remaining species that have survived
        for m in range (0, l):
            Afreeze.append(A[m])
            Sex.append(1) # value of 1 as this species has survived

        #now time to analyse the coefficiants for each species.

        for m in range (0, len(Sex)):
            X1 = sum(Afreeze[m])/len(Afreeze[m]) # this is the mean
            X2 = 0
            for p in range (len(Afreeze[m])):
                X2 = X2 + Afreeze[m][p]

            X2 = X2/len(Afreeze[m])
            Sav.append(X1)
            Svar.append(X2 - X1*X1)

    spec = []
    for b in range(0,n):
        spec.append(b)

    plt.plot(Svar,Sav)
    plt.show()
    #plt.scatter(spec, Sav)
    #plt.show()


if __name__ == '__main__':
    main()

私はこれをまったく理解できません!以前は機能していたと思いますが、その後は機能しなくなりました。何か案は?

4

2 に答える 2

2

あなたの問題はこのセクションにあります:

if any(t<0 for t in x): #if any of the solutions in x are negative
    p=np.where(x==min(x)) # find the most negative solution, p is the position
    #now store the A coefficiants of the extinct species in the Afreeze list
    Afreeze.append(A[p])

2D配列にインデックスを付けていても、結果は2D配列のままです。したがって、Afreeze1D配列ではなく、2D配列が追加されます。後で、の個別の要素を合計するとAfreeze、合計された2D配列は1D配列になり、それがとに追加されSavますSvar。これらの変数をにフィードするまでにplt.plot()、matplotlibは、単一の数値ではなく要素の1つとして配列を取得しますが、これはもちろん処理できません。

あなたはおそらく欲しい:

if any(t<0 for t in x): 
    p=np.where(x==min(x))
    Afreeze.append(A[p][0])

しかし、私はスクリプトのロジックにあまり従おうとはしていません。それはあなた次第です。

おそらく、これが本当にあなたが望むものであるかどうかを確認するのは良いことです:printそれがに追加される前の行のA[p][0]の値Afreeze

random.random()マトリックスの作成のために、ifステートメントが常に真であるとは限らないため、問題が常に発生するとは限らないことに注意しました。細かい部分ですが、人々を混乱させる可能性があります。

于 2012-10-24T14:19:15.277 に答える
1

インデントを修正しますか?

import numpy as np
import numpy.linalg
import random
import matplotlib.pyplot as plt
import pylab
from scipy.optimize import curve_fit
from array import array

def main():
    n=20 #number of species
    spec=np.zeros((n+1))
    for i in range(0,n):
        spec[i]=i
    t=100 #initial number of matrices to check
    B = np.zeros((n+1)) #matrix to store the results of how big the matrices have to be

    for k in range (0,t):
        A=np.zeros((n,n))
        I=np.ones((n))
        for i in range(0,n):
            for j in range(i+1,n):
                A[j,i]=random.random()


        for i in range(0,n):
            for j in range(i+1,n):
                A[i,j] = A[j,i]


        for i in range(n):
            A[i,i]=1

        allpos = 0

        while allpos !=1: #while all solutions are not positive

            x = numpy.linalg.solve(A,I)
            if any(t<0 for t in x): #if any of the solutions in x are negative
                p=np.where(x==min(x)) # find the most negative solution, p is the position
                x=np.delete(x, p, 0)
                A=np.delete(A, p, 0)
                A=np.delete(A, p, 1)
                I=np.delete(I, p, 0)

            else: 
                allpos = 1 #set allpos to one so loop is broken
        l=len(x)
        B[l] = B[l]+1
    B = B/n
    pi=3.14

    resfile=open("results.txt","w")
    for i in range (0,len(spec)):
        resfile.write("%d " % spec[i])
        resfile.write("%0.6f \n" %B[i])
    resfile.close()


    plt.hist(B, bins=n)
    plt.title("Histogram")
    plt.show()

    plt.plot(spec,B)
    plt.xlabel("final number of species")
    plt.ylabel("fraction of total matrices")
    plt.title("plot")
    plt.show()
if __name__ == '__main__':
    main()

これを得ました:

ここに画像の説明を入力してください

于 2012-10-24T10:47:44.167 に答える