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([])
与列表 []
不同。查看它的shape
和ndim
。要使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]])
所以,为你的datai
做np.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追加数组而不展平的主要内容,如果未能解决你的问题,请参考以下文章