Python 三维数组与numpy分类的比较
我正在尝试对numpy数组进行一些基本分类。。。 我想比较二维数组和三维数组,沿三维方向,并根据相应的z轴值进行分类 因此,给定3个堆叠成3d阵列的阵列:Python 三维数组与numpy分类的比较,python,numpy,multidimensional-array,scipy,Python,Numpy,Multidimensional Array,Scipy,我正在尝试对numpy数组进行一些基本分类。。。 我想比较二维数组和三维数组,沿三维方向,并根据相应的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)) 和另一个
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阵列选择,但出于这样的目的,它有助于保持它的简单。我们可以假设在平局的情况下,我们将取较低的,因此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]
对于每个子列表,显示2d数组的差异级别!然后您可以从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函数应用到数组的每个元素。p> 在这种情况下,python函数可以使用定义的任何中断对每个像素进行分类:
import numpy as np
a2d = np.array([[1,2,4],[5,5,2],[2,3,3]])
def classify(x):
if x >= 4:
return 3
elif x >= 2:
return 2
elif x > 0:
return 1
else:
return 0
vclassify = np.vectorize(classify)
result = vclassify(a2d)
多亏了@perrygeo和@Kasra-他们让我朝着一个好的方向思考。 因为我想要最接近的3d数组的z值的分类,所以我不能做简单的数学运算——我需要最接近的值的(z)索引 我通过列举2d数组的两个轴,并与3d数组的相应(z)索引进行接近度比较来实现这一点 也许有一种方法可以在不迭代2d数组的情况下实现这一点,但至少我避免了迭代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 = np.dstack((a1,a2,a3))
a2d = np.array([[1,2,4],[5,5,2],[2,3,3]])
classOut = np.empty_like(a2d)
def find_nearest_idx(array,value):
idx = (np.abs(array-value)).argmin()
return idx
# enumerate to get indices
for i,a in enumerate(a2d):
for ii,v in enumerate(a):
valStack = a3d[i,ii]
nearest = find_nearest_idx(valStack,v)
classOut[i,ii] = nearest
print classOut
这让我很生气
[[0 0 1]
[2 2 0]
[0 1 1]]
这告诉我(例如)a2d[0,0]最接近a3d[0,0]的0指数,在我的例子中,这意味着它最接近该2d位置的最小值。a2d[1,1]最接近2-指数,在我的例子中,这意味着更接近该2d位置的最大值。我喜欢这种方法。我正在为每个单独的值寻找分类,但这很酷@abenrob你可以把它放在函数中@abenrob签出编辑!而且,如果你觉得这个答案很有帮助,你可以通过投票和接受答案来告诉社区;)我没有得到我所期望的结果,所以我稍后会更深入地挖掘,然后我会回复你。当你比较二维和三维时,你如何定义“最近的”?对于一个给定的函数f(a2d,a23d),你期望的回报是什么?@perrygeo-在一个特定的例子中,我将拥有多年的NDVI数据。我将运行累积最小、最大和平均光栅,它们表示像素级度量。我需要能够将任何单个NDVI与这些累积指标进行比较,并将每个像素分类为更接近最小值、最大值或平均值。因此,数字接近三个指标中的每一个,最接近的一个定义分类。在死分割的情况下,我可能会使用平均值,但这将非常罕见,因此不会真正扭曲结果。这对于基于数组本身中的值进行分类很好,但我不知道如何使用它与其他3d数组中的值进行比较……基于示例,我假设,
a1
表示一个在空间上没有变化的全局最小统计值,可以更有效地表示为标量值。如果这些随空间变化,我的答案根本不起作用。但它可以解决标准的“分类”问题。是的,坏的伪造数据没有帮助,不是吗!