如何在numpy数组中添加数组而不进行扁平化

kzipqqlq  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(111)
>>> import numpy as np
>>> a = np.array([112,123,134,145])
>>> b = np.array([212,223,234])
>>> c = np.array([312,323])
>>> d = np.array([412])

>>> arr = np.hstack([a,b,c,d])
>>> arr
array([112, 123, 134, 145, 212, 223, 234, 312, 323, 412])

>>> arr = np.array([a,b,c,d])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (4,) + inhomogeneous part.
>>>

预期数组-

array([[112,123,134,145], [212,223,234], [312,323], [412]],
      [[512,523,534,545], [612,623,634], [712,723], [812]], ...)
u1ehiz5o

u1ehiz5o1#

当你尝试创建一个“ragged”数组时,你必须指定object dtype:

In [24]: >>> a = np.array([112,123,134,145])
    ...: >>> b = np.array([212,223,234])
    ...: >>> c = np.array([312,323])
    ...: >>> d = np.array([412])
In [25]: arr = np.array([a,b,c,d], dtype=object)
In [26]: arr
Out[26]: 
array([array([112, 123, 134, 145]), array([212, 223, 234]),
       array([312, 323]), array([412])], dtype=object)

请记住,这样的数组比简单的数组列表好不了多少,也许更糟。
没有object dtype时得到的错误消息在不同版本中有所不同。它曾经是自动的,然后你得到一个警告,然后一个错误消息。现在你得到了这个错误。显然,从数值数组的Angular 来看,这样的数组是“次优”的。
对于某些形状,您必须从arr = np.empty(4, object)开始,并从列表中插入数组。

In [27]: arr = np.empty(4,object); arr[:] = [a,b,c,d]
In [28]: arr
Out[28]: 
array([array([112, 123, 134, 145]), array([212, 223, 234]),
       array([312, 323]), array([412])], dtype=object)
In [29]: arr = np.empty(4,object); arr[:] = [i.tolist() for i in [a,b,c,d]]
In [30]: arr
Out[30]: 
array([list([112, 123, 134, 145]), list([212, 223, 234]),
       list([312, 323]), list([412])], dtype=object)
egmofgnx

egmofgnx2#

numpy.hstack()函数可用于沿沿着水平轴连接两个或多个数组。但是,这个函数会在连接数组之前将它们展平。所以你可以用这个代替:

import numpy as np

a = [112, 123, 134, 145]
b = [212, 223, 234]
c = [312, 323]
d = [412]

# Create a list of lists
list_of_lists = [a, b, c, d]

arr = np.empty(len(list_of_lists), dtype=object)
arr[:] = list_of_lists

print(arr)
oxcyiej7

oxcyiej73#

不知道为什么这对你不起作用,因为它对我来说没有任何问题,你所做的是这种情况下的常见方法(另一个例子是here)。
你可以尝试的另一种类似的方法(不是特别有效,但可能会完成工作)就是像这样附加一个空白列表:

import numpy as np
a = np.array([112,123,134,145])
b = np.array([212,223,234])
c = np.array([312,323])
d = np.array([412])
e = []
for sublist in [a,b,c,d]: 
    e.append(list(sublist)) #include the list cast to get the expected result you mentioned 
 e = np.array(e)

老实说,这似乎很奇怪,你所做的没有工作,但我希望这有助于提供至少另一种选择。
我应该注意到,我确实遇到过一个专门用于处理大小可变的嵌套数据的库,称为AwkwardArray

相关问题