如何使用数组访问矩阵元素?

2024-06-16 13:59:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要把矩阵的所有nan都改成不同的值。我可以使用argwhere很容易地获得nan位置,但是我不确定如何以编程方式访问这些位置。以下是我的非工作代码:

myMatrix = np.array([[3.2,2,float('NaN'),3],[3,1,2,float('NaN')],[3,3,3,3]])

nanPositions = np.argwhere(np.isnan(myMatrix))
maxVal = np.nanmax(abs(myMatrix))
for pos in nanPositions :
    myMatrix[pos] = maxval

问题是myMatrix[pos]不接受pos作为数组。在


Tags: 代码pos编程np方式矩阵nanfloat
3条回答
In [54]: arr = np.array([[3.2,2,float('NaN'),3],[3,1,2,float('NaN')],[3,3,3,3]])
    ...: 
In [55]: arr
Out[55]: 
array([[3.2, 2. , nan, 3. ],
       [3. , 1. , 2. , nan],
       [3. , 3. , 3. , 3. ]])

nan的位置:

^{pr2}$

where生成数组的元组;argwhere相同的值,但作为二维数组

In [58]: arr[Out[56]]
Out[58]: array([nan, nan])
In [59]: arr[Out[56]] = [100,200]
In [60]: arr
Out[60]: 
array([[  3.2,   2. , 100. ,   3. ],
       [  3. ,   1. ,   2. , 200. ],
       [  3. ,   3. ,   3. ,   3. ]])

argwhere可用于索引单个项目:

In [72]: for ij in Out[57]:
    ...:     print(arr[tuple(ij)]) 
100.0
200.0

这里需要tuple(),因为np.array([1,3])在第一个维度上被解释为2个元素的索引。在

另一种获取索引元组的方法是使用unpacking

In [74]: [arr[i,j] for i,j in Out[57]]
Out[74]: [100.0, 200.0]

因此,虽然argparse看起来很有用,但它比普通的where更难使用。在

如其他答案所述,您可以使用布尔索引(我已经修改了arr,因此isnan测试不再有效):

In [75]: arr[arr>10]
Out[75]: array([100., 200.])

有关使用列表或数组编制索引以及使用元组索引的详细信息:

In [77]: arr[[0,0]]      # two copies of row 0
Out[77]: 
array([[  3.2,   2. , 100. ,   3. ],
       [  3.2,   2. , 100. ,   3. ]])
In [78]: arr[(0,0)]      # one element
Out[78]: 3.2

In [79]: arr[np.array([0,0])]         # same as list
Out[79]: 
array([[  3.2,   2. , 100. ,   3. ],
       [  3.2,   2. , 100. ,   3. ]])
In [80]: arr[np.array([0,0]),:]       # making the trailing : explicit
Out[80]: 
array([[  3.2,   2. , 100. ,   3. ],
       [  3.2,   2. , 100. ,   3. ]])

sacul已经介绍了生成输出的更有效的方法。但是,如果你想使用数组,你的二维矩阵索引是错误的。在

至少对我来说,这有点不直观,但你需要使用:

myMatrix[[all_row_indices], [all_column_indices]] 

以下内容将满足您的期望:

^{pr2}$

您可以在documentation中看到有关高级索引的更多信息

你可以这样做(IIUC):

myMatrix[np.isnan(myMatrix)] = np.nanmax(abs(myMatrix))

相关问题 更多 >