python - 按索引之和对 NumPy 数组的元素进行分组

标签 python arrays numpy

我有几个尺寸为 30*30*30 的大型 numpy 数组,我需要遍历该数组,获取每个索引三元组的总和,并按该总和对这些元素进行分箱。例如,考虑这个简单的 2*2 数组:

test = np.array([[2,3],[0,1]])

该数组的索引为 [0,0]、[0,1]、[1,0] 和 [1,1]。此例程将返回列表:[2,[3,0],1],因为数组 test 中的 2 的索引和为 0,3 和 0 的索引和为 1,1 的索引和为 2。我知道迭代 NumPy 数组并检查总和的蛮力方法是可行的,但对于我的具有大 N(=30) 和多个数组的实际情况来说,它的效率太低了。任何有关使用 NumPy 例程完成此分组的输入将不胜感激。预先感谢您。

最佳答案

这是一种应该相当快但不是超快的方法:在我的机器上30x30x30需要20 ms

import numpy as np

# make example
dims = 2,3,4
a = np.arange(np.prod(dims),0,-1).reshape(dims)

# create and sort indices
idx = sum(np.ogrid[tuple(map(slice,dims))])
srt = idx.ravel().argsort(kind='stable')

# use order to arrange and split data
asrt = a.ravel()[srt]
spltpts = idx.ravel().searchsorted(np.arange(1,np.sum(dims)-len(dims)+1),sorter=srt)
out = np.split(asrt,spltpts)

# admire
out
# [array([24]), array([23, 20, 12]), array([22, 19, 16, 11,  8]), array([21, 18, 15, 10,  7,  4]), array([17, 14,  9,  6,  3]), array([13,  5,  2]), array([1])]

关于python - 按索引之和对 NumPy 数组的元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60800717/

相关文章:

python - Mac : How can I use Python 3. 7 在 Visual Studio Code 的命令行中?

javascript - 如何在javascript中添加数组对象值

memory - 转置数组并实际重新排序内存

python - 如何在Matplotlib中分析数据并添加到绘图

python - "Error binding parameter 0 - probably unsupported type"使用 Bottle 访问元素时

Python、MySQL 回归、SQL bug 或错误的条件?

python 正则表达式打印文本文件中的先前单词

c++ - 动态分配的 C 字符串数组

javascript - 用于处理更改的 React Props 而不是函数

python - KMeans 聚类不适用于超过 4 列的数据框