如何用不同形状的numpy数组填充numpy数组?

qlvxas9a  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(126)

我试图用多个不同形状的numpy数组填充一个numpy数组。例如,我有两个numpy数组,形状分别是(4,1000)和(4,2000),我想将它们组合成一个numpy数组。
目前,我的数据存储在这样的列表中:[numpy array,numpy array,...,numpy array].我想把它转换成一个像这样的numpy数组结构:numpy array(numpy array,numpy array,...,numpy array).
我已经遇到了一些建议使用dtype=object的指南,但我仍然遇到了一个错误:“ValueError:无法将输入数组从形状(4,1597)广播到形状(4,)"。
我的方法中是否遗漏了什么?有没有其他方法可以有效地解决这个问题?

llmtgqce

llmtgqce1#

你没有提供一个例子,你的代码,但这对我来说是工作。

import numpy as np

arrays = np.array([np.array([1]), np.array([2,3])], dtype=object)
print(arrays)  # [array([1]) array([2, 3])]

字符串
我不清楚在这种情况下np.arraylist有什么优势。

xjreopfe

xjreopfe2#

在过去的几个numpy版本中,“参差不齐”阵列的创建已经收紧。
这曾经奏效:

In [225]: np.array([np.array([1]), np.array([2,3])])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[225], line 1
----> 1 np.array([np.array([1]), np.array([2,3])])

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.

字符串
现在(1.24?)我们已经明确给予了dtype:

In [226]: np.array([np.array([1]), np.array([2,3])], dtype=object)
Out[226]: array([array([1]), array([2, 3])], dtype=object)


通常情况下,np.array构成一个多维数字dtype数组。object dtype是一个后备选项,在数组中存储引用,而不是数字。这样的数组几乎是列表。它的计算是以列表解析的速度执行的(如果有的话),而不是数字数组的快速编译速度。
2d数组也可以这样打包-如果第一维不同:

In [228]: np.array([np.ones((3,3)), np.zeros((2,4))], dtype=object)
Out[228]: 
array([array([[1., 1., 1.],
              [1., 1., 1.],
              [1., 1., 1.]]), array([[0., 0., 0., 0.],
                                     [0., 0., 0., 0.]])], dtype=object)


dtype在第一个维度匹配时没有帮助:

In [229]: np.array([np.ones((2,3)), np.zeros((2,4))], dtype=object)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[229], line 1
----> 1 np.array([np.ones((2,3)), np.zeros((2,4))], dtype=object)

ValueError: could not broadcast input array from shape (2,3) into shape (2,)


相反,你必须创建一个“空白”数组,并填充它:

In [230]: arr = np.empty(2, object)    
In [231]: arr[:] = [np.ones((2,3)), np.zeros((2,4))]    
In [232]: arr
Out[232]: 
array([array([[1., 1., 1.],
              [1., 1., 1.]]), array([[0., 0., 0., 0.],
                                     [0., 0., 0., 0.]])], dtype=object)


如果所有维度都匹配,并且您不需要正确的n-d数字数组,则也需要此创建/填充。所以这是一个好主意,不管维度组合如何。

相关问题