如何用零填充numpy数组的上三角?

met*_*ane 5 python numpy

用零填充numpy数组的下三角形的最佳方法是什么,这样我就不必执行以下操作:

a=np.random.random((5,5))
a = np.triu(a)
Run Code Online (Sandbox Code Playgroud)

因为np.triu返回一个副本,而不是一个视图.因为我正在处理大型数组,所以最好不需要列表索引.

sen*_*rle 13

深入研究内部,triu你会发现它只是将输入乘以输出tri.

所以你可以通过以下输出将数组乘以原地tri:

>>> a = np.random.random((5, 5))
>>> a *= np.tri(*a.shape)
>>> a
array([[ 0.46026582,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.76234296,  0.5298908 ,  0.        ,  0.        ,  0.        ],
       [ 0.08797149,  0.14881991,  0.9302515 ,  0.        ,  0.        ],
       [ 0.54794779,  0.36896506,  0.92901552,  0.73747726,  0.        ],
       [ 0.62917827,  0.61674542,  0.44999905,  0.80970863,  0.41860336]])
Run Code Online (Sandbox Code Playgroud)

比如triu,这仍然会创建第二个数组(输出tri),但至少它会就地执行操作.啪啪是一种捷径; 考虑将您的功能基于完整版本的triu强大功能.但请注意,您仍然可以指定对角线:

>>> a = np.random.random((5, 5))
>>> a *= np.tri(*a.shape, k=2)
>>> a
array([[ 0.25473126,  0.70156073,  0.0973933 ,  0.        ,  0.        ],
       [ 0.32859487,  0.58188318,  0.95288351,  0.85735005,  0.        ],
       [ 0.52591784,  0.75030515,  0.82458369,  0.55184033,  0.01341398],
       [ 0.90862183,  0.33983192,  0.46321589,  0.21080121,  0.31641934],
       [ 0.32322392,  0.25091433,  0.03980317,  0.29448128,  0.92288577]])
Run Code Online (Sandbox Code Playgroud)

  • 保持相同的一般想法,如果内存或速度是一个问题,你可能想看看即将发布的1.9版本中相同功能的代码,请参阅[here](https://github.com/numpy/numpy/blob /maintenance/1.9.x/numpy/lib/twodim_base.py).基本上,你应该总是要求`np.tri(*a.shape,dtype = np.bool)`,并且在1.9中你将为自己保存一个不必要的完整数组副本,它将使用SIMD代码构建. (2认同)