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.
我该怎么办?
答案 0 :(得分:2)
您可以将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
)
答案 1 :(得分:1)
除非你真的需要混合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,包含所需dtype
的2个字段:
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')])
尝试混合整数和字符串时,需要注意预期用途。
请注意当您创建一个空的&#39;阵列:
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)
根据您的需要,这样的数组可能是一个美化的列表,也可能是一个贬值的列表。