arrays - 针对唯一值的高效数据筛选 (Python)

标签 arrays python-2.7 numpy unique

我有一个由 (X,Y,Z,A) 值组成的二维 Numpy 数组,其中 (X,Y,Z) 是 3D 空间中的笛卡尔坐标,A 是该位置的某个值。举个例子..

__X__|__Y__|__Z__|__A_
  13 |  7  |  21 | 1.5
  9  |  2  |  7  | 0.5
  15 |  3  |  9  | 1.1
  13 |  7  |  21 | 0.9
  13 |  7  |  21 | 1.7
  15 |  3  |  9  | 1.1

有没有一种有效的方法来找到 (X,Y) 的所有唯一组合,并将它们的值相加?例如,(13,7) 的总数为 (1.5+0.9+1.7),即 4.1。

最佳答案

scipy.sparse 矩阵采用此类信息,但仅为 2d

sparse.coo_matrix((data, (row, col)))

rowcol 是索引,例如您的 XYZ。它对重复项求和。

这样做的第一步是对索引进行词法排序。这会将具有匹配坐标的点彼此相邻。

我相信,实际的分组和求和是在编译代码中完成的。用 numpy 术语来说,要做到这么快,部分困难在于每个组中的元素数量是可变的。有些是独一无二的,有些可能有 3 个或更多。

Python itertools 有一个 groupby 工具。 Pandas 也有分组功能。我还可以想象使用 default_dict 对值进行分组和求和。

ufunc reduceat 也可能有效,尽管它在 1d 中比在 2 或 3 中更容易使用。

如果您忽略 Z,稀疏 coo_matrix 方法可能是最简单的。

In [2]: X=np.array([13,9,15,13,13,15])
In [3]: Y=np.array([7,2,3,7,7,3])
In [4]: A=np.array([1.5,0.5,1.1,0.9,1.7,1.1])
In [5]: M=sparse.coo_matrix((A,(X,Y)))
In [15]: M.sum_duplicates()
In [16]: M.data
Out[16]: array([ 0.5,  2.2,  4.1])
In [17]: M.row
Out[17]: array([ 9, 15, 13])
In [18]: M.col
Out[18]: array([2, 3, 7])
In [19]: M
Out[19]: 
<16x8 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in COOrdinate format>

这是我对 lexsort 的想法

In [32]: Z=np.array([21,7,9,21,21,9])
In [33]: xyz=np.stack([X,Y,Z],1)
In [34]: idx=np.lexsort([X,Y,Z])
In [35]: idx
Out[35]: array([1, 2, 5, 0, 3, 4], dtype=int32)
In [36]: xyz[idx,:]
Out[36]: 
array([[ 9,  2,  7],
       [15,  3,  9],
       [15,  3,  9],
       [13,  7, 21],
       [13,  7, 21],
       [13,  7, 21]])
In [37]: A[idx]
Out[37]: array([ 0.5,  1.1,  1.1,  1.5,  0.9,  1.7])

当像这样排序时,Z 坐标变得更加明显,至少对于这个目的而言是这样。

使用 reduceat 对组求和:

In [40]: np.add.reduceat(A[idx],[0,1,3])  
Out[40]: array([ 0.5,  2.2,  4.1])

(现在我只看了 [0,1,3] 列表)

关于arrays - 针对唯一值的高效数据筛选 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790938/

相关文章:

java - 如何分割我的用户字符串并在给定分割大小的情况下将它们排列在列和行中?

C++ - 在类上初始化一个空数组

Python:导入 scipy 导致回溯引用已删除的文件

python - 用 flask 实时数据?

使用 numpy 操作数组后 Python OpenCV 绘图错误

python - 在 python 中处理非常大的 netCDF 文件

php - 多维数组合并

Php PDO 想要从 2 列中获取值并创建数组(一列值作为键,另一列作为数组)

python-2.7 - 在 python 中为 Firefox Geckodriver 设置 selenium 代理

python - mp3 音频从交互式 python 播放,但不是从 bash 播放