簡體   English   中英

創建numpy數組時出錯

[英]Error while creating numpy array

len = 5
results = np.empty(len)
for i in range(len):
    results[i] = ([999, 'sss'])

我想預定義列表的長度,即5,然后填寫一些包含數字和字符串變量的值...但是,無論我使用什么

for i in range(len):
    results[i] = ([[999], ['sss']])

要么

for i in range(len):
    results[i] = [[999], ['sss']]

我收到錯誤消息為

ValueError                                Traceback (most recent call last)
<ipython-input-114-4cfd5264742d> in <module>()
      2 results = np.empty(len)
      3 for i in range(len):
----> 4     results[i] = ([999, 'sss'])

ValueError: setting an array element with a sequence.

我應該怎么做?

您可以將dtype 'object'用於results數組:

length = 5
results = np.empty(length, dtype='object')
for i in range(length):
    results[i] = ([999, 'sss'])

>>> results
array([list([999, 'sss']), list([999, 'sss']), list([999, 'sss']),
       list([999, 'sss']), list([999, 'sss'])], dtype=object)

如果要放入results數組的長度始終為2,則在制作np.empty時最好指定適當的形狀:

length = 5
results = np.empty((length,2), dtype='object')
for i in range(length):
    results[i] = ([999, 'sss'])

>>> results
array([[999, 'sss'],
       [999, 'sss'],
       [999, 'sss'],
       [999, 'sss'],
       [999, 'sss']], dtype=object)

注意,盡量不要使用len作為變量,因為它已經是python中的內置函數(在上面的示例中,我將其替換為length

除非您真的需要一個帶有dtype混合的numpy數組,否則我建議您列出一個列表:

In [96]: alist = []
In [97]: for i in range(5):
    ...:     alist.append([999, 'sss'])
    ...:     
In [98]: alist
Out[98]: [[999, 'sss'], [999, 'sss'], [999, 'sss'], [999, 'sss'], [999, 'sss']]

或者,如果您列出一個元組列表,則可以繼續創建一個結構化數組-1d,其中包含2個所需dtype字段:

In [99]: alist = []
In [100]: for i in range(5):
     ...:     alist.append((999, 'sss'))
     ...:     
     ...:     
In [101]: alist
Out[101]: [(999, 'sss'), (999, 'sss'), (999, 'sss'), (999, 'sss'), (999, 'sss')]
In [102]: np.array(alist, dtype='int,U3')
Out[102]: 
array([(999, 'sss'), (999, 'sss'), (999, 'sss'), (999, 'sss'),
       (999, 'sss')], dtype=[('f0', '<i8'), ('f1', '<U3')])

嘗試混合整數和字符串時,需要注意預期的用途。


注意創建“空”數組時會發生什么:

In [103]: arr = np.empty(4)
In [104]: arr
Out[104]: array([0.e+000, 0.e+000, 0.e+000, 5.e-324])
In [105]: arr.dtype
Out[105]: dtype('float64')

它創建所需大小的數組,但具有默認dtype float 初始值是垃圾-盡管顯示為浮點數。

這意味着您只能在arr[0]中添加一個浮點數。

In [106]: arr[0]=999       # converted to float
In [107]: arr[1]='sss'
...
ValueError: could not convert string to float: 'sss'
In [108]: arr
Out[108]: array([9.99e+002, 0.00e+000, 0.00e+000, 4.94e-324])

而且它也不會接受列表或元組,即序列。 它必須是可以轉換為浮點數的東西。

指定object dtype確實可以讓您在元素中放置任何內容,因為元素實際上包含指針-就像列表一樣。

In [110]: arr = np.empty(4,dtype=object)
In [111]: arr
Out[111]: array([None, None, None, None], dtype=object)
In [112]: arr[0]=1
In [113]: arr[1]=.999
In [114]: arr[2]='sss'
In [115]: arr[3]=[999,'sss']
In [116]: arr
Out[116]: array([1, 0.999, 'sss', list([999, 'sss'])], dtype=object)

根據您的需要,這樣的數組可以是美化的列表,也可以是降級的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM