我试图以递归方式定义N维的numpy数组。经过几个小时的研究,我发现了一些可行的方法(np.append和np.concatenate),但是这些方法都没有给我所需的输出。我也得到了:
[-0.6778734 -0.73517866 -0.73517866 0.6778734 ]
(1-d数组)或
[array([-0.6778734 , -0.73517866]), array([-0.73517866, 0.6778734 ])]
(数组列表)
我的输入:
[(1.2840277121727839, array([-0.6778734, -0.73517866])),
(0.049083398938327472, array([-0.73517866, 0.6778734 ]))]
期望的输出:
array([-0.6778734, -0.73517866], [-0.73517866, 0.6778734])
是否有可能从数组创建一个numpy数组,因为将它们转换为列表并返回到数组似乎计算效率低下?
提前致谢!
答案 0 :(得分:1)
您的输入是元组列表,每个元组由一个数字和一个数组组成。出于某种原因,你想丢掉数字,只是将数组合并成一个更大的数组 - 是吗?
In [1067]: x=[(1.2840277121727839, np.array([-0.6778734, -0.73517866])),
(0.049083398938327472, np.array([-0.73517866, 0.6778734 ]))]
In [1068]: x
Out[1068]:
[(1.2840277121727839, array([-0.6778734 , -0.73517866])),
(0.04908339893832747, array([-0.73517866, 0.6778734 ]))]
列表推导可以很好地为元组提取所需的元素:
In [1069]: [y[1] for y in x]
Out[1069]: [array([-0.6778734 , -0.73517866]), array([-0.73517866, 0.6778734 ])]
和vstack
非常适合将数组合并为更大的数组。
In [1070]: np.vstack([y[1] for y in x])
Out[1070]:
array([[-0.6778734 , -0.73517866],
[-0.73517866, 0.6778734 ]])
vstack
只是concatenate
,增加了一步,确保输入为2d。
np.array([y[1] for y in x])
也可以,因为您要添加维度。
我假设array([-0.6778734, -0.73517866], [-0.73517866, 0.6778734])
有拼写错误 - 它缺少一组[]
。 np.array
的第二个参数是dtype,而不是另一个列表。
请注意,np.array
和np.concatentate
都会列出一个列表。它可以是列表列表或数组列表。它没有太大的区别。而在这个阶段不要担心计算效率。每次组合来自2个或更多阵列的数据时,都会进行复制。数组具有固定的大小,如果不制作新副本,则无法“增长”。
In [1074]: np.concatenate([y[1] for y in x]).reshape(2,2)
Out[1074]:
array([[-0.6778734 , -0.73517866],
[-0.73517866, 0.6778734 ]])
列表实际上是1d,因此np.concatenate
将它们连接到该维度上,从而生成4个元素的1d数组。 reshape
纠正了这一点。 vstack
使它们(1,2)
并在第一维上连接。
在新维度上连接数组的另一个表达式:
np.concatenate([y[1][None,...] for y in x], axis=0)
[None,...]
在开始时添加了一个新维度。
答案 1 :(得分:0)
试试这个:
import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
print(repr(np.vstack((a, b))))
给出:
array([[1, 2],
[3, 4]])
答案 2 :(得分:0)
您可以在表格
的列表input_data
下形成所需的2D数组
input_data = [(1.2840277121727839, np.array([-0.6778734, -0.73517866])),
(0.049083398938327472, np.array([-0.73517866, 0.6778734 ]))]
经由
nparr = np.array(list(row[1] for row in input_data))