递归地定义N维numpy数组

时间:2015-08-10 22:10:24

标签: python arrays numpy recursion

我试图以递归方式定义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数组,因为将它们转换为列表并返回到数组似乎计算效率低下?

提前致谢!

3 个答案:

答案 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.arraynp.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))