作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个形状为 arr.shape = N,M,M 的 numpy 数组。
我想访问每个 M,M 数组的下三角。我尝试使用
arr1 = arr[:,np.tril_indices(M,-1)]
arr1 = arr[:][np.tril_indices(M,-1)]
等等,在第一种情况下内核死机,而在第二种情况下我收到一条错误消息:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-23-1b36c5b12706> in <module>
----> 1 arr1 = arr[:][np.tril_indices(M,-1)]
IndexError: index 6 is out of bounds for axis 0 with size 6
在哪里
N=6
为了澄清,我想找到每个 M,M 数组(N 个这样的实例)的下三角中的所有元素,并将结果保存在一个新的形状数组中:
arr1.shape = (N,(M*(M-1))/2)
编辑:
虽然 np.tril(arr) 有效,但它会产生一个数组
arr1 = np.tril(arr)
arr1.shape
#(N,M,M)
我希望生成的数组具有指定的形状,即我不想要数组的上部
谢谢
最佳答案
使用tri...
函数集时,检查源代码会很有用。它们都是 python,并且基于 np.tri
。
做一个小样本数组 - 来说明和验证答案:
In [205]: arr = np.arange(18).reshape(2,3,3) # arange(1,19) might be better
In [206]: arr
Out[206]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]]])
tril
将上三角值设置为 0。它在这种情况下有效,但没有记录对 3d 数组的应用。
In [207]: np.tril(arr)
Out[207]:
array([[[ 0, 0, 0],
[ 3, 4, 0],
[ 6, 7, 8]],
[[ 9, 0, 0],
[12, 13, 0],
[15, 16, 17]]])
但是在代码中 if 首先从最后 2 个维度构造一个 bool 掩码:
In [208]: mask = np.tri(*arr.shape[-2:], dtype=bool)
In [209]: mask
Out[209]:
array([[ True, False, False],
[ True, True, False],
[ True, True, True]])
并使用 np.where
将一些值设置为 0。这在 3d 情况下通过广播工作。 mask
和 arr
在最后两个维度上匹配,所以 mask
可以广播
来匹配:
In [210]: np.where(mask, arr, 0)
Out[210]:
array([[[ 0, 0, 0],
[ 3, 4, 0],
[ 6, 7, 8]],
[[ 9, 0, 0],
[12, 13, 0],
[15, 16, 17]]])
您的 tril_indices
就是这个掩码的索引:
In [217]: np.nonzero(mask) # aka np.where
Out[217]: (array([0, 1, 1, 2, 2, 2]), array([0, 0, 1, 0, 1, 2]))
In [218]: np.tril_indices(3)
Out[218]: (array([0, 1, 1, 2, 2, 2]), array([0, 0, 1, 0, 1, 2]))
它们不能直接用于索引arr
:
In [220]: arr[np.tril_indices(3)].shape
Traceback (most recent call last):
File "<ipython-input-220-e26dc1f514cc>", line 1, in <module>
arr[np.tril_indices(3)].shape
IndexError: index 2 is out of bounds for axis 0 with size 2
In [221]: arr[:,np.tril_indices(3)].shape
Out[221]: (2, 2, 6, 3)
但是解压两个索引数组:
In [222]: I,J = np.tril_indices(3)
In [223]: I,J
Out[223]: (array([0, 1, 1, 2, 2, 2]), array([0, 0, 1, 0, 1, 2]))
In [224]: arr[:,I,J]
Out[224]:
array([[ 0, 3, 4, 6, 7, 8],
[ 9, 12, 13, 15, 16, 17]])
bool 掩码也可以直接使用:
In [226]: arr[:,mask]
Out[226]:
array([[ 0, 3, 4, 6, 7, 8],
[ 9, 12, 13, 15, 16, 17]])
基础 np.tri
通过简单地在索引上做一个外部 >= 来工作
In [231]: m = np.greater_equal.outer(np.arange(3),np.arange(3))
In [232]: m
Out[232]:
array([[ True, False, False],
[ True, True, False],
[ True, True, True]])
In [234]: np.arange(3)[:,None]>=np.arange(3)
Out[234]:
array([[ True, False, False],
[ True, True, False],
[ True, True, True]])
关于python - 如何访问 N*M*M numpy 数组的下三角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69912462/
我有一个绕其 3 轴旋转的立方体,当 key[a] == true 时,它会向左旋转,就好像它正在滚动一样。将立方体向任何方向旋转 45 度,将其向后旋转 90 度,以获得继续的错觉。这将保持 3
我是一名优秀的程序员,十分优秀!