三维索引和多维数组/矩阵求和轴的选择

时间:2017-02-19 10:58:07

标签: python arrays matrix multidimensional-array indexing

我正在尝试使用多维数组来解决问题,而不是求助于for循环,以获得性能提升,但是我在索引方面遇到了麻烦。

我尝试使用np.newaxis进行各种排列,但似乎无法实现以下功能。

问题:

第1部分)取一个名为a的M x N x N阵列,对于每个M平方矩阵,将上三角矩阵元素设置为负值。

第2部分)对每个M矩阵(形状为N X N)中的所有元素求和,返回带有M个元素的1D数组。我们称这个数组为b

尝试解决方案

这是我的MWP /尝试使用循环(这确实有效,但我宁愿找到一个完全基于阵列/矩阵的方法

a = np.array(
      [[[  0,  1],
        [  5,  0]],

       [[ 0,  3],
        [ 2,  0]]])

第1部分):

triangular_upper_idx = np.triu_indices_from(a[0])
for i in range(len(a)):
    a[i][triangular_upper_idx] *= -1
a

结果:

array([[[ 0, -1],
        [ 5,  0]],

       [[ 0, -3],
        [ 2,  0]]])

第2部分):

b = np.zeros(len(a))
for i in range(len(a)):
    b[i] = np.sum(a[i])
b

结果:

array([ 4., -1.])

注意: 我在这个主题上看到了类似的问题(Triangular indices for multidimensional arrays in numpy),但是那里的解决方案是嵌套for循环......我觉得numpy可能会提供一个更有效,更聪明的基于数组的解决方案吗?

非常感谢任何指导。

由于

1 个答案:

答案 0 :(得分:1)

是numpy有工具

r = 2

neg_uppr = np.triu(-np.ones((r,r)),1) + np.tril(np.ones((r,r)))

无法从数字示例中判断出是否要将对角线反转?然后使用np.triu(-np.ones((r,r))) + np.tril(np.ones((r,r)),-1)

neg_uppr
Out[23]: 
array([[ 1., -1.],
       [ 1.,  1.]])

a = np.array(
      [[[  0,  1],
        [  5,  0]],

       [[ 0,  3],
        [ 2,  0]]])    

快速使用内置元素算法

a = a * neg_uppr

a
Out[26]: 
array([[[ 0., -1.],
        [ 5.,  0.]],

       [[ 0., -3.],
        [ 2.,  0.]]])    

您可以指定要汇总的轴:

np.sum(a, (1,2))
Out[27]: array([ 4., -1.])