2017-04-15 34 views
0

我试图比较一个np数组中的值,顺序追加它们并创建一个具有np数组最小值的向量(向量的长度应为N * 2 -1,如果矩阵维数是N×N)。我附上了一张图片来更好地说明问题。基本上,我想从位置[0,0]开始,然后依次比较[0,1]和[1,0]等值。当nan与数字进行比较时,会自动选择数字。为了比较两个数字,即[0,2]和[1,1]中的值,应选择较小的一个。在同一个np数组中明智地比较元素Python

5x5nparray

原因矩阵是楠上三角矩阵值上市,而不是0的,是矩阵是对称的,我认为这会使得向量的计算,在它的最小值更容易。

下面是我写的一些代码,试图解决这个问题。我意识到索引i和j在矩阵中移动不正确,但是,我完全失去了如何正确地完成它。

注意:我没有包含生成矩阵的代码,只是因为它是较大脚本的一部分,我想避免混淆。在这个例子中,我将dim = 5表示为5x5大小的矩阵(mat)。此外,这只是最小值碰巧是[mat [0,0],mat [0,1],mat [1,1],mat [1,2] ...]的一个例子。

x=[] 
dim = 5 
for i in range(dim-1): 
    for j in range(dim-1): 

    if mat[i,j+1] > mat[i+1,j]: 
     x.append(mat[i+1,j]) 

    elif mat[i,j+1] < mat[i+1,j]: 
     x.append(mat[i,j+1]) 

    elif m.isnan(mat[i,j+1]): 
     x.append(mat[i+1,j]) 

    elif m.isnan(mat[i+1,j]): 
     x.append(mat[i,j+1]) 

我会很感激任何帮助/提示与此。

编辑:

感谢您的所有输入。我想我想出了如何去做。我认为,这样做可能有更多pythonic的方式,但是,我缺乏现在的技能。代码打击应该能够通过选择最小值的上三角矩阵并将它们附加到一个向量。在这个例子中,我的意思是矢量= [2.8,4.7,7.6,5.5,5.3,0.18,-3.9,-11.1,-20.1]。

import numpy as np 


dim = 5 
mat = np.array([[2.802, 4.713, 9.581, 15.339, 22.273], 
    [np.nan, 7.647, 5.559, 7.317, 10.250], 
    [np.nan, np.nan, 5.383, 0.184, -0.882], 
    [np.nan, np.nan, np.nan, -3.992, -11.124], 
    [np.nan, np.nan, np.nan, np.nan, -20.192]]) 
mat_to_vect = np.reshape(mat, (dim**2)) 
min_vect = [mat_to_vect[0]] 

i = 1 
j = dim 

while i and j < dim**2-1: 

    if mat_to_vect[i] > mat_to_vect[j]: 
     min_vect.append(mat_to_vect[j]) 
     j += dim 
     i += dim 

    elif mat_to_vect[i] < mat_to_vect[j]: 
     min_vect.append(mat_to_vect[i]) 
     j += 1 
     i += 1 

    elif m.isnan(mat_to_vect[i]): 
     min_vect.append(mat_to_vect[j]) 
     j += dim 
     i += dim 

    elif m.isnan(mat_to_vect[j]): 
     min_vect.append(mat_to_vect[i]) 
     j += 1 
     i += 1 

min_vect.append(mat_to_vect[dim**2-1]) 
+0

是你正在尝试做的,从每列一个附加最小数量_vector_?你能解释一下“最小值”是指什么? – nikjohn

+0

对不起,我不清楚。如果我从mat [0,0]开始,那么我想比较mat [0,1]和mat [1,0]的值。在这种情况下,mat [1,0] = nan,所以mat [0,1]应该被附加到x。下一步是比较mat [0,2]和mat [1,1],这里mat [1,1] Jond

+0

您应该考虑选项使用像numpy.matrix.min()这样的内置方法,请参阅numpy文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.min.html。 @NaN提供了类似的解决方案,但可能对您的情况更好。 – nikjohn

回答

0
import numpy as np 


dim = 5 
mat = np.array([[2.802, 4.713, 9.581, 15.339, 22.273], 
    [np.nan, 7.647, 5.559, 7.317, 10.250], 
    [np.nan, np.nan, 5.383, 0.184, -0.882], 
    [np.nan, np.nan, np.nan, -3.992, -11.124], 
    [np.nan, np.nan, np.nan, np.nan, -20.192]]) 
mat_to_vect = np.reshape(mat, (dim**2)) 
min_vect = [mat_to_vect[0]] 

i = 1 
j = dim 

while i and j < dim**2-1: 

    if mat_to_vect[i] > mat_to_vect[j]: 
     min_vect.append(mat_to_vect[j]) 
     j += dim 
     i += dim 

    elif mat_to_vect[i] < mat_to_vect[j]: 
     min_vect.append(mat_to_vect[i]) 
     j += 1 
     i += 1 

    elif m.isnan(mat_to_vect[i]): 
     min_vect.append(mat_to_vect[j]) 
     j += dim 
     i += dim 

    elif m.isnan(mat_to_vect[j]): 
     min_vect.append(mat_to_vect[i]) 
     j += 1 
     i += 1 

min_vect.append(mat_to_vect[dim**2-1]) 
0

这对评论太大了,但可能会为您的最终解决方案提供一些选项。

a = [[2.802, 4.713, 9.581, 15.339, 22.273], 
    [np.nan, 7.647, 5.559, 7.317, 10.250], 
    [np.nan, np.nan, 5.383, 0.184, -0.882], 
    [np.nan, np.nan, np.nan, -3.992, -11.124], 
    [np.nan, np.nan, np.nan, np.nan, -20.192]] 
b = np.nanmin(a, axis=0) 
b 
array([ 2.802, 4.713, 5.383, -3.992, -20.192]) 

现在如果-20.192所需的结果,那么最后的解决方案很简单。 实际上,使用np.triu的下半部分设置为np.nan的设置允许使用nan函数来获取最小值。在你的情况下,如果-20.192是所期望的结果,则按列获得最小值,然后按行排列。 如果这不是最后一种情况,则需要进一步定义从单元格(0,0)开始依次通过数组的步骤。总之,np.nanmin似乎是你以后的样子。

附录 或者你也可以按顺序做到这一点,我认为你添加的注释指

a 
array([[ 2.802, 4.713, 9.581, 15.339, 22.273], 
     [ nan, 7.647, 5.559, 7.317, 10.25 ], 
     [ nan,  nan, 5.383, 0.184, -0.882], 
     [ nan,  nan,  nan, -3.992, -11.124], 
     [ nan,  nan,  nan,  nan, -20.192]]) 

b = [np.nanmin(a[:i], axis=0) for i in range(1, a.shape[0]+1)] 
b 
[array([ 2.802, 4.713, 9.581, 15.339, 22.273]), 
array([ 2.802, 4.713, 5.559, 7.317, 10.25 ]), 
array([ 2.802, 4.713, 5.383, 0.184, -0.882]), 
array([ 2.802, 4.713, 5.383, -3.992, -11.124]) 
array([ 2.802, 4.713, 5.383, -3.992, -20.192])]] 
+0

谢谢你的建议。我在评论部分回答如上。 – Jond

+0

@Jond以上是你要找的东西吗? – NaN

+0

感谢您的评论。我不确定上面的代码如何得到x = [2.8,4.7,7.6,5.5,5.3,0.18,-3.9,-11.1,-20.1]。我编辑了我的原始文章,这给了我想要的结果。 while循环基本上在每个点检查哪些值较小,然后附加它。如果它是在一个数字和一个数字之间进行比较,它会选择数字。 – Jond