Python Numpy追加数组而不展平

Posted

技术标签:

【中文标题】Python Numpy追加数组而不展平【英文标题】:Python Numpy append array without flattening 【发布时间】:2019-01-11 13:46:14 【问题描述】:

在 Python 3 中,我在一个循环中导入多个数据文件,并且我希望能够将所有数据存储在一个二维数组中。我从data = np.array([]) 之类的东西开始,在每次迭代中我想添加一个新数组datai = np.array([1,2,3]),我怎样才能让我的最终数组看起来像这样? [[1,2,3],[1,2,3],...,[1,2,3]]

我尝试过 np.append、np.concatenate 和 np.stack,但似乎都没有。我正在尝试的示例代码:

data = np.array([])
for i in range(datalen):
    datai = *func to load data as array*
    data = np.append(data, datai)

但这当然会返回一个扁平数组。有什么办法可以取回长度为datalen 的二维数组,每个元素都是数组datai

谢谢!

【问题讨论】:

看起来你想要vstack。你所有的子数组长度都一样吗? 是的!好的,我可以让它在第一次之后的所有迭代中都起作用,但是由于我从一个空数组开始,它给了我一个维度错误。我可以只输入一个 if 语句来保存第一个数组和 vstack,但是有没有更简洁的方法呢? 查看np.append 文档。省略axis 参数是什么意思? 您正在尝试对数组使用列表追加模型。 np.empty([]) 与列表 [] 不同。查看它的shapendim。要使concatenate 起作用,输入必须具有匹配的尺寸。 data1 是 1d (3,)。它可以在轴 0 上连接到另一个一维数组。要加入一个新的初始轴,它需要是 2d(这是vstack 地址)。无论如何,重复列表追加是正确的方法,而不是重复连接。 data1的形状是什么?你如何加载它?通常,当从 txt 文件加载时,结果数组将是 2d。当然可以是 1d。 【参考方案1】:

最快的方法是 vstack

data = np.vstack((get_data() for i in range(datalen)))

vstack 需要一个元组/可迭代

data = np.vstack((data1, data2, data3))

或者你可以通过附加axis=0来做到这一点

data = np.empty(shape=(0, 3))
data = np.append(data, datai.reshape((-1, 3)), axis=0)  # -1 will make the rows automatic

【讨论】:

【参考方案2】:

使用列表推导的解决方案 1:

data = []
datalen = 4
datai = range(1,4)
data = [list(datai) for _ in range(datalen)]
print (data)

输出

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

解决方案 2(有点冗长)

data = []
datalen = 4

for i in range(datalen):
    datai = range(1,4)
    data.append(list(datai))
print (data)  

与上面的输出相同。在第二种方法中,您也可以简单地使用data.append(list(range(1,4)))。您可以选择是否要将datai 转换为列表。如果你希望最终输出为一个数组,你可以使用np.array()

【讨论】:

方法 2:既然要将其转换为列表,为什么要调用 np.arange(1,4) 而不是 range(1,4) 好收获。固定的!谢谢【参考方案3】:

你可以试试这个-

data = np.zeros(shape=(datalen,len(datai))
for i in range(datalen):
   data[i] = datai

【讨论】:

如果你想用 NumPy 来做。【参考方案4】:

它叫numpy.tile

来自官方文档:

>>> c = np.array([1,2,3,4])
>>> np.tile(c,(3,1))
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

所以,为你的datainp.tile(datai,(N_repeats,1))

【讨论】:

【参考方案5】:

你可以像这样使用 np.reshape 重塑你的数组

flattened_array = np.array([1,2,3,1,2,3,1,2,3])

wanted_array = np.reshape(flattened_array, (-1, 3))

这会导致

[[1, 2, 3],[1, 2, 3],[1, 2, 3]]

【讨论】:

以上是关于Python Numpy追加数组而不展平的主要内容,如果未能解决你的问题,请参考以下文章

Python:展平多个嵌套的字典并追加

python numpy数组追加在.py文件中不起作用,但在终端中起作用

未成功追加到空 NumPy 数组

将空行插入或追加到 numpy 数组

在追加模式下加载使用 numpy.save 保存的数组

有没有办法在没有numpy的情况下追加二维数组?