ValueError: thiết lập một phần tử mảng với một chuỗi


183

Mã Python này:

import numpy as p

def firstfunction():
    UnFilteredDuringExSummaryOfMeansArray = []
    MeanOutputHeader=['TestID','ConditionName','FilterType','RRMean','HRMean',
                      'dZdtMaxVoltageMean','BZMean','ZXMean','LVETMean','Z0Mean',
                      'StrokeVolumeMean','CardiacOutputMean','VelocityIndexMean']
    dataMatrix = BeatByBeatMatrixOfMatrices[column]
    roughTrimmedMatrix = p.array(dataMatrix[1:,1:17])


    trimmedMatrix = p.array(roughTrimmedMatrix,dtype=p.float64)  #ERROR THROWN HERE


    myMeans = p.mean(trimmedMatrix,axis=0,dtype=p.float64)
    conditionMeansArray = [TestID,testCondition,'UnfilteredBefore',myMeans[3], myMeans[4], 
                           myMeans[6], myMeans[9], myMeans[10], myMeans[11], myMeans[12],
                           myMeans[13], myMeans[14], myMeans[15]]
    UnFilteredDuringExSummaryOfMeansArray.append(conditionMeansArray)
    secondfunction(UnFilteredDuringExSummaryOfMeansArray)
    return

def secondfunction(UnFilteredDuringExSummaryOfMeansArray):
    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
    return

firstfunction()

Ném thông báo lỗi này:

File "mypath\mypythonscript.py", line 3484, in secondfunction
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
ValueError: setting an array element with a sequence.

Bất cứ ai có thể chỉ cho tôi phải làm gì để khắc phục sự cố trong mã bị hỏng ở trên để nó ngừng ném thông báo lỗi không?


EDIT: Tôi đã thực hiện một lệnh in để lấy nội dung của ma trận và đây là những gì nó được in ra:

UnFilteredDuringExSummaryOfMeansArray là:

[['TestID', 'ConditionName', 'FilterType', 'RRMean', 'HRMean', 'dZdtMaxVoltageMean', 'BZMean', 'ZXMean', 'LVETMean', 'Z0Mean', 'StrokeVolumeMean', 'CardiacOutputMean', 'VelocityIndexMean'],
[u'HF101710', 'PreEx10SecondsBEFORE', 'UnfilteredBefore', 0.90670000000000006, 66.257731979420001, 1.8305673000000002, 0.11750000000000001, 0.15120546389880002, 0.26870546389879996, 27.628261216480002, 86.944190346160013, 5.767261352345999, 0.066259118585869997],
[u'HF101710', '25W10SecondsBEFORE', 'UnfilteredBefore', 0.68478571428571422, 87.727887206978565, 2.2965444125714285, 0.099642857142857144, 0.14952476549885715, 0.24916762264164286, 27.010483303721429, 103.5237336525, 9.0682762747642869, 0.085022572648242867],
[u'HF101710', '50W10SecondsBEFORE', 'UnfilteredBefore', 0.54188235294117659, 110.74841107829413, 2.6719262705882354, 0.077705882352917643, 0.15051306356552943, 0.2282189459185294, 26.768787504858825, 111.22827075238826, 12.329456404418824, 0.099814258468417641],
[u'HF101710', '75W10SecondsBEFORE', 'UnfilteredBefore', 0.4561904761904762, 131.52996981880955, 3.1818159523809522, 0.074714285714290493, 0.13459344175047619, 0.20930772746485715, 26.391156337028569, 123.27387909873812, 16.214243779323812, 0.1205685359981619]]

Trông giống như một ma trận 5 hàng x 13 cột đối với tôi, mặc dù số lượng hàng là biến khi dữ liệu khác nhau được chạy qua tập lệnh. Với cùng dữ liệu mà tôi đang thêm vào này.

EDIT 2 : Tuy nhiên, đoạn script đang bị lỗi. Vì vậy, tôi không nghĩ rằng ý tưởng của bạn giải thích vấn đề đang xảy ra ở đây. Cảm ơn bạn mặc dù. Còn ý tưởng nào khác không?


EDIT 3:

FYI, nếu tôi thay thế dòng mã vấn đề này:

    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]

với điều này thay vào đó:

    RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray)[1:,3]

Sau đó, phần đó của tập lệnh hoạt động tốt mà không gây ra lỗi, nhưng sau đó dòng mã này tiếp tục xuống dòng:

p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())

Ném lỗi này:

File "mypath\mypythonscript.py", line 3631, in CreateSummaryGraphics
  p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())
TypeError: cannot perform reduce with flexible type

Vì vậy, bạn có thể thấy rằng tôi cần chỉ định loại dữ liệu để có thể sử dụng ylim trong matplotlib, nhưng chỉ định loại dữ liệu đang ném thông báo lỗi đã khởi tạo bài đăng này.


có ai muốn xóa tất cả các chi tiết không liên quan khỏi câu hỏi này không?
Chris_Rands

Câu trả lời:


254

Từ mã bạn đã chỉ cho chúng tôi, điều duy nhất chúng tôi có thể nói là bạn đang cố gắng tạo một mảng từ một danh sách không có hình dạng như một mảng đa chiều. Ví dụ

numpy.array([[1,2], [2, 3, 4]])

hoặc là

numpy.array([[1,2], [2, [3, 4]]])

sẽ mang lại thông báo lỗi này, vì hình dạng của danh sách đầu vào không phải là "hộp" tổng quát có thể biến thành một mảng nhiều chiều. Vì vậy, có thể UnFilteredDuringExSummaryOfMeansArraychứa các chuỗi có độ dài khác nhau.

Chỉnh sửa : Một nguyên nhân có thể khác cho thông báo lỗi này là cố gắng sử dụng một chuỗi làm thành phần trong một mảng kiểu float:

numpy.array([1.2, "abc"], dtype=float)

Đó là những gì bạn đang cố gắng theo chỉnh sửa của bạn. Nếu bạn thực sự muốn có một mảng NumPy chứa cả chuỗi và float, bạn có thể sử dụng dtype object, cho phép mảng giữ các đối tượng Python tùy ý:

numpy.array([1.2, "abc"], dtype=object)

Không biết mã của bạn sẽ hoàn thành cái gì, tôi không thể đánh giá nếu đây là thứ bạn muốn.


1
Cảm ơn bạn, nhưng tôi không nghĩ đó là câu trả lời. Tôi đã thêm nội dung của mảng khi nó ném lỗi ở trên. Và dường như nó là một cái hộp khi tôi dán nó vào notepad và kiểm tra từng dòng một. Còn ý tưởng nào khác không?
MedicalMath

2
Chỉnh sửa của bạn dường như đã giải quyết vấn đề của tôi. Tôi cần phải đặt dtype = object. Cảm ơn rât nhiều.
MedicalMath

Câu hỏi này đã được trả lời hoàn toàn.
MedicalMath

Một khả năng khác có thể là một vấn đề trong 1.9 khi xây dựng một loạt các đối tượng (không nhất thiết phải liệt kê) thực hiện __getitem__như được chỉ định ở đây: github.com/numpy/numpy/issues/5100
bảnh bao

47

Giá trị PythonError:

ValueError: setting an array element with a sequence.

Có nghĩa chính xác những gì nó nói, bạn đang cố nhồi nhét một dãy số vào một khe số. Nó có thể được ném trong các trường hợp khác nhau.

1. Khi bạn vượt qua một tuple python hoặc danh sách được hiểu là một phần tử mảng numpy:

import numpy

numpy.array([1,2,3])               #good

numpy.array([1, (2,3)])            #Fail, can't convert a tuple into a numpy 
                                   #array element


numpy.mean([5,(6+7)])              #good

numpy.mean([5,tuple(range(2))])    #Fail, can't convert a tuple into a numpy 
                                   #array element


def foo():
    return 3
numpy.array([2, foo()])            #good


def foo():
    return [3,4]
numpy.array([2, foo()])            #Fail, can't convert a list into a numpy 
                                   #array element

2. Bằng cách cố gắng nhồi nhét một chiều dài mảng numpy> 1 vào một phần tử mảng numpy:

x = np.array([1,2,3])
x[0] = np.array([4])         #good



x = np.array([1,2,3])
x[0] = np.array([4,5])       #Fail, can't convert the numpy array to fit 
                             #into a numpy array element

Một mảng numpy đang được tạo và numpy không biết cách nhồi nhét các bộ dữ liệu đa trị hoặc mảng vào các khe phần tử đơn. Nó mong đợi bất cứ điều gì bạn đưa ra để đánh giá một con số, nếu không, Numpy trả lời rằng nó không biết cách đặt một phần tử mảng với một chuỗi.


lời giải thích rất hay
Tejas Shetty

15

Trong trường hợp của tôi, tôi đã gặp Lỗi này trong Tensorflow, Lý do là tôi đã cố gắng cung cấp một mảng với độ dài hoặc chuỗi khác nhau:

thí dụ :

import tensorflow as tf

input_x = tf.placeholder(tf.int32,[None,None])



word_embedding = tf.get_variable('embeddin',shape=[len(vocab_),110],dtype=tf.float32,initializer=tf.random_uniform_initializer(-0.01,0.01))

embedding_look=tf.nn.embedding_lookup(word_embedding,input_x)

with tf.Session() as tt:
    tt.run(tf.global_variables_initializer())

    a,b=tt.run([word_embedding,embedding_look],feed_dict={input_x:example_array})
    print(b)

Và nếu mảng của tôi là:

example_array = [[1,2,3],[1,2]]

Sau đó tôi sẽ nhận được lỗi:

ValueError: setting an array element with a sequence.

nhưng nếu tôi làm đệm thì:

example_array = [[1,2,3],[1,2,0]]

Bây giờ nó đang hoạt động.


Tôi đang sử dụng pyCUDA và vô tình gán một phần tử gpuarray cho mảng numpy. Tôi đã nhận được cùng một lỗi.
Tirtha R

@Aaditya Ura, làm thế nào để tiến hành đệm như vậy, bạn có thể tham khảo một cái gì đó?
pari

7

Đối với những người gặp rắc rối với các vấn đề tương tự trong Numpy, một giải pháp rất đơn giản sẽ là:

xác định dtype=objectkhi xác định một mảng để gán giá trị cho nó. ví dụ:

out = np.empty_like(lil_img, dtype=object)

3
Làm thế nào nó khác với Editmột phần của câu trả lời được chấp nhận.
सत यमयमयम े

Làm việc như người ở!
mcagriardic

5

Trong trường hợp của tôi, vấn đề là một vấn đề khác. Tôi đã thử chuyển đổi danh sách các danh sách của int thành mảng. Vấn đề là có một danh sách có độ dài khác với danh sách khác. Nếu bạn muốn chứng minh điều đó, bạn phải làm:

print([i for i,x in enumerate(list) if len(x) != 560])

Trong trường hợp của tôi, tham chiếu chiều dài là 560.


2

Trong trường hợp của tôi, vấn đề là với một biểu đồ phân tán của khung dữ liệu X []:

ax.scatter(X[:,0],X[:,1],c=colors,    
       cmap=CMAP, edgecolor='k', s=40)  #c=y[:,0],

#ValueError: setting an array element with a sequence.
#Fix with .toarray():
colors = 'br'
y = label_binarize(y, classes=['Irrelevant','Relevant'])
ax.scatter(X[:,0].toarray(),X[:,1].toarray(),c=colors,   
       cmap=CMAP, edgecolor='k', s=40)

Một số giải thích thêm sẽ tốt đẹp.
Tejas Shetty

1
Lỗi giá trị có nghĩa là chúng tôi đang cố gắng tải một mảng phần tử n (chuỗi) vào một khe số duy nhất chỉ có dấu phẩy. Do đó, bạn đang cố gắng thiết lập một phần tử mảng với một chuỗi. Với .toarray () chúng tôi phóng to nó thành một chuỗi các chuỗi. toarray () trả về một ndarray;
Max Kleiner

0

Khi hình dạng không đều hoặc các thành phần có các kiểu dữ liệu khác nhau, dtypechỉ có thể đối số được truyền cho np.array object.

import numpy as np

# arr1 = np.array([[10, 20.], [30], [40]], dtype=np.float32)  # error
arr2 = np.array([[10, 20.], [30], [40]])  # OK, and the dtype is object
arr3 = np.array([[10, 20.], 'hello'])     # OK, and the dtype is also object

``


Chào mừng đến với SO. Câu hỏi này rất cũ và có vẻ như câu trả lời của bạn trùng lặp ít nhất một trong những câu hỏi khác. Nếu câu trả lời của bạn thực tế khác nhau, hãy thử thêm một số chi tiết giải thích làm thế nào.
Jens Ehrich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.