python - numpy 分类与 3d 数组的比较

标签 python numpy multidimensional-array scipy

我正在尝试对 numpy 数组进行一些基本分类... 我想沿第三维比较 2d 数组与 3d 数组,并根据相应的 z 轴值进行分类。

给定 3 个数组,它们堆叠成一个 3d 数组:

import numpy as np
a1 = np.array([[1,1,1],[1,1,1],[1,1,1]])
a2 = np.array([[3,3,3],[3,3,3],[3,3,3]])
a3 = np.array([[5,5,5],[5,5,5],[5,5,5]])
a3d = dstack((a1,a2,a3))

和另一个二维数组

a2d = np.array([[1,2,4],[5,5,2],[2,3,3]])

我希望能够将 a2d 与 a3d 进行比较,并返回 a3d 的级别最接近的 2d 数组。 (或者我假设任何自定义函数都可以沿 z 轴比较每个值,并根据该比较返回一个值。)

编辑

我修改了数组以更紧密地匹配我的数据。 a1 是最小值,a2 是平均值,a3 是最大值。所以我想输出每个a2d值是否更接近a1(分类“1”)a2(分类“2”)或a3(分类“3”)。我将其作为 3d 数组进行,因为在实际数据中,它不会是一个简单的 3 数组选择,但出于 SO 目的,它有助于保持简单。我们可以假设,在平局的情况下,我们将取较低的,因此 2 将被归类为级别“1”,4 将被归类为级别“2”。

最佳答案

您可以使用以下列表理解:

>>> [sum(sum(abs(i-j)) for i,j in z) for z in [zip(i,a2d) for i in a3d]]
[30.0, 22.5, 30.0]

在前面的代码中,我使用 zip 创建以下列表,即 3d 列表的每个子数组的 zip,然后您需要计算这些对的元素相减的总和,然后再次求和:

>>> [zip(i,a2d) for i in a3d]
[[(array([ 1.,  3.,  1.]), array([1, 2, 1])), (array([ 2.,  2.,  1.]), array([5, 5, 4])), (array([ 3.,  1.,  1.]), array([9, 8, 8]))], [(array([ 4.,  6.,  4.]), array([1, 2, 1])), (array([ 5. ,  6.5,  4. ]), array([5, 5, 4])), (array([ 6.,  4.,  4.]), array([9, 8, 8]))], [(array([ 7.,  9.,  7.]), array([1, 2, 1])), (array([ 8.,  8.,  7.]), array([5, 5, 4])), (array([ 9.,  7.,  7.]), array([9, 8, 8]))]]

然后对于所有子数组,您将拥有以下列表:

[30.0, 22.5, 30.0]

对于每个子列表,显示与二维数组的差异级别!然后您可以从 a3d 获取相对子数组,如下所示:

>>> a3d[l.index(min(l))]
array([[ 4. ,  6. ,  4. ],
       [ 5. ,  6.5,  4. ],
       [ 6. ,  4. ,  4. ]])

您也可以将其放入函数中:

>>> def find_nearest(sub,main):
...     l=[sum(sum(abs(i-j)) for i,j in z) for z in [zip(i,sub) for i in main]]
...     return main[l.index(min(l))]
... 
>>> find_nearest(a2d,a3d)
array([[ 4. ,  6. ,  4. ],
       [ 5. ,  6.5,  4. ],
       [ 6. ,  4. ,  4. ]])

关于python - numpy 分类与 3d 数组的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28991309/

相关文章:

python - 更改单个行值时保持总和约束行的比例

python - 信号库处理Python中哪些函数是可重入的

python - 是否可以不从 python 中的函数返回任何内容?

python - 什么时候获取 numpy 数组的子矩阵返回 View 而不是复制?

python - 为什么 numpy.sum 在添加生成器的元素时返回 float64 而不是 uint64?

Python 字符串和整数连接

python - 向量化函数转换为向量化函数 Python

Python:多维字典

c++ - 连续分配多维数组

python - 变维数组