在Numpy中管理高维度

时间:2016-11-13 08:07:34

标签: numpy numpy-broadcasting

我想写一个包含4个变量的函数:main,每个变量都在不同的维度。

这可以通过f(x1,x2,x3,x4)实现。

你知道更聪明的方式吗?

2 个答案:

答案 0 :(得分:2)

您正在寻找np.ix_ 1

f(*np.ix_(x1, x2, x3, x4))

例如:

>>> np.ix_([1, 2, 3], [4, 5])
(array([[1],
        [2],
        [3]]), array([[4, 5]]))

1 或等效地,np.meshgrid(..., sparse=True, indexing='ij')

答案 1 :(得分:1)

一种方法是重塑每个阵列,沿引导轴给出适当数量的单例尺寸。要在所有数组中执行此操作,我们可以使用列表推导。

因此,处理通用数量的输入数组的一种方法是 -

L = [x1,x2,x3,x4]
out = [l.reshape([1]*i + [len(l)]) for i,l in enumerate(L)]

示例运行 -

In [186]: # Initialize input arrays
     ...: x1 = np.random.randint(0,9,(4))
     ...: x2 = np.random.randint(0,9,(2))
     ...: x3 = np.random.randint(0,9,(5))
     ...: x4 = np.random.randint(0,9,(3))
     ...: 

In [187]: A = x1,x2[None],x3[None,None],x4[None,None,None]

In [188]: L = [x1,x2,x3,x4]
     ...: out = [l.reshape([1]*i + [len(l)]) for i,l in enumerate(L)]
     ...: 

In [189]: A
Out[189]: 
(array([2, 1, 1, 1]),
 array([[8, 2]]),
 array([[[0, 3, 5, 8, 7]]]),
 array([[[[6, 7, 0]]]]))

In [190]: out
Out[190]: 
[array([2, 1, 1, 1]),
 array([[8, 2]]),
 array([[[0, 3, 5, 8, 7]]]),
 array([[[[6, 7, 0]]]])]