Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 三维数组与numpy分类的比较_Python_Numpy_Multidimensional Array_Scipy - Fatal编程技术网

Python 三维数组与numpy分类的比较

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)) 和另一个

我正在尝试对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))
和另一个二维阵列

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
表示一个在空间上没有变化的全局最小统计值,可以更有效地表示为标量值。如果这些随空间变化,我的答案根本不起作用。但它可以解决标准的“分类”问题。是的,坏的伪造数据没有帮助,不是吗!