如何解决Numpy多维数组中任何轴上“ True”值的最大数量
我在Numpy中有一个带有布尔值的多维数组。就我而言,它是一个立方体。
我想知道包含所有True
值的最小矩形框的最大尺寸。换句话说,这就是True
值之间任何轴上的最大距离。
例如,如果我有以下数组
np.array([[
[False,False,False],[False,],[
[False,True,]])
它将返回 4 ,因为在此“框”中垂直距离为4(或左下角值和右上角值之间的距离为4):
...
[False False True]
[False True True]
[ True True True]
[ True False False]
...
我在想以下内容,但这听起来是多余的,重复的和昂贵的……而且实际上并不完全有效:)
from itertools import product
max_1 = max(sum(cube[:,i,j]) for i,j in product(range(3),range(3)))
max_2 = max(sum(cube[i,:,range(3)))
max_3 = max(sum(cube[i,j,:]) for i,range(3)))
# ... and then
max_dim = max(max_1,max_2,max_3)
有什么建议吗?
解决方法
如果您的目标是获得最大尺寸的长度,则可以使用
max(np.ptp(d) + 1 for d in np.nonzero(a))
其中a
是您的布尔数组。您问题中数组的输出为4
。如果您需要获得True
值的最小3D边界框,请继续阅读。
可以使用numpy.nonzero
在每个维度中找到True
值的索引,然后根据numpy.nonzero
找到的索引的最小值和最大值对原始数组进行索引。 / p>
import numpy as np
a = np.array([[
[False,False,False],[False,],[
[False,True,]])
slices = [slice(d.min(),d.max()+1) for d in np.nonzero(a)]
a[slices[0],slices[1],slices[2]]
输出与所需输出匹配。
array([[[False,True],[ True,False]]])
可以将其转换为用于N-d阵列的函数。这使用了numpy.s_
,它创建了一个索引表达式,可用于获取数组的切片。
def get_bbox_indexer(a):
slices = tuple(slice(d.min(),d.max()+1) for d in np.nonzero(a))
return np.s_[slices]
indexer = get_bbox_indexer(a)
a[indexer]
输出与上面相同
array([[[False,False]]])
要获取切片数组最大尺寸的大小,您可以
indexer = get_bbox_indexer(a)
max(a[indexer].shape)
,
我认为最简单的方法是获取select distinct t.ColumnA
from tablename t
where not exists (select 1 from tablename where ColumnA = t.ColumnA and ColumnB not in ('b1','b2'))
元素的索引,然后计算它们的最小值和最大值-这将是您的矩形。
True
然后获得最大长度,只需将这两个相减,找到最大值,然后加1。
a = [...]
indices = np.array(np.where(a)).T
print(np.min(indices,axis=0),np.max(indices,axis=0))
[2 1 1] [2 4 3]
,
此答案实际上对我有用,但它假设True
的值是连续的。
import numpy as np
a = np.array([[
[False,]])
max_axis = (np.sum(np.any(a,axis=axis),axis=1) for axis in range(3))
max_dim = max(max(m) for m in max_axis)
- 对于每个轴,检测其他轴上是否至少存在一个
True
- 使用True计数此类轴的数量
- 计算每个轴的最大值
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。