我试图比较一个np数组中的值,顺序追加它们并创建一个具有np数组最小值的向量(向量的长度应为N * 2 -1,如果矩阵维数是N×N)。我附上了一张图片来更好地说明问题。基本上,我想从位置[0,0]开始,然后依次比较[0,1]和[1,0]等值。当nan与数字进行比较时,会自动选择数字。为了比较两个数字,即[0,2]和[1,1]中的值,应选择较小的一个。在同一个np数组中明智地比较元素Python
原因矩阵是楠上三角矩阵值上市,而不是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])
是你正在尝试做的,从每列一个附加最小数量_vector_?你能解释一下“最小值”是指什么? – nikjohn
对不起,我不清楚。如果我从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
您应该考虑选项使用像numpy.matrix.min()这样的内置方法,请参阅numpy文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.min.html。 @NaN提供了类似的解决方案,但可能对您的情况更好。 – nikjohn