在Python中使用2D列表的逻辑索引

时间:2017-06-22 16:02:41

标签: python numpy

我想在2D列表中使用逻辑索引,但似乎不支持此功能。

数据

# For example
twoDimList = [[0, 0, 0, 1], [0, 0, 1, 1], [0, 1, 1, 1]]

原始资料

for rowIdx in range(0, len(twoDimList)):
    for colIdx in range(0, len(twoDimList[rowIdx])):
        if twoDimList[rowIdx][colIdx] == 0:
            twoDimList[rowIdx][colIdx] = np.nan

我的理想解决方案

twoDimList[twoDimList == 0] = numpy.nan # In fact, it's illegal.

如何使这种设计模式更加巧妙。

1 个答案:

答案 0 :(得分:3)

根据您的评论,列表不是一个numpy数组。您可以使用以下内容构建一个:

import numpy as np

# convert the 2d Python list into a numpy array
twoDimList = np.array(twoDimList,dtype=np.float)

twoDimList[twoDimList == 0] = np.nan

dtype在这里至关重要:如果你没有指定它,numpy会假设你给它一个整数矩阵,并且整数没有NaN(仅适用于浮动NaN已定义)。

您还可以为numpy数组提供另一个变量名(但是在numpy数组中完成的更改不会反映在原始Python列表中)。

如果您的原始列表是(基于您的样本数据):

twoDimList = [[0, 0, 0, 1], [0, 0, 1, 1], [0, 1, 1, 1]]

我们得到:

>>> twoDimList = [[0, 0, 0, 1], [0, 0, 1, 1], [0, 1, 1, 1]]
>>> twoDimList = np.array(twoDimList,dtype=np.float)
>>> twoDimList[twoDimList == 0] = np.nan
>>> twoDimList
array([[ nan,  nan,  nan,   1.],
       [ nan,  nan,   1.,   1.],
       [ nan,   1.,   1.,   1.]])