我正在尝试对 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/