我正在尝试使用多维数组来解决问题,而不是求助于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可能会提供一个更有效,更聪明的基于数组的解决方案吗?
非常感谢任何指导。
由于
答案 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.])