python - Numpy 将字母评估为整数

标签 python python-3.x numpy

在 3d 数组中,我知道我可以使用以下方法转换整数:

import numpy as np 
x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0,3,3]], np.int32)
x[x==0] = 99
print (x[0:])
    [[99  1  1  2]
     [99  5 99 99]
     [ 2 99  3  3]]

有没有办法将字符串输入矩阵?例如像这样的东西?

import numpy as np 
x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0, 3, 3]], np.int32)
x[x==0] = int('x') ## This might be something like str('x), but I want it to 
                   ## equal 0
print (x[0:])
    [[x  1  1  2]
     [x  5  x  x]
     [2  x  3  3]]

最佳答案

您要求的可以完成,但只能通过将数字数组更改为对象数组来实现——也就是说,general-anything-at -所有值:

>>> x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0,3,3]], dtype=object)
>>> x[x==0] = 'x'
>>> x
array([['x', 1, 1, 2],
       ['x', 5, 'x', 'x'],
       [2, 'x', 3, 3]], dtype=object)

但这可能不是您想要的。 numpy 的大部分速度和空间节省来自数组具有特定数据类型的事实;如果您使用通用 object,它们不会比仅使用列表的列表更小,也不会更快。如果您使用 numpy 只是为了语法方便而不是空间或速度优势,那可能没问题,但在您这样做之前绝对需要考虑一下。

此外,对象数组遵循通常的 Python 规则来对这些对象进行任何算术运算。例如:

>>> x+2
TypeError: must be str, not int

这似乎不是很有用。


如果您正在寻找一个特殊的“标记值”,以防止您意外地认为某些值实际上没有意义,那么您可以使用 float 来做到这一点,尽管不能使用整数,方法是使用 nan :

>>> x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0,3,3]], dtype=np.float64)
>>> x[x==0] = np.nan
>>> x
array([[nan,  1.,  1.,  2.],
       [nan,  5., nan, nan],
       [ 2., nan,  3.,  3.]])

nan 可以存储在 float64 槽中,因此您仍然拥有固定类型数组的所有空间和速度优势。并且(默认情况下)nan 上的操作不会引发异常,它们只会返回 nan。所以:

>>> x+2
array([[nan,  3.,  3.,  4.],
       [nan,  7., nan, nan],
       [ 4., nan,  5.,  5.]])

在某些情况下,只保留数组并使用掩码对数组进行操作可能会更好:

>>> x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0,3,3]], dtype=np.int64)
>>> x[x!=0] += 2
>>> x
array([[0, 3, 3, 4],
       [0, 7, 0, 0],
       [4, 0, 5, 5]])

或者,如果您的索引不重要,只有您的值,您甚至可以这样做(最简单的版本,甚至忽略轴):

>>> x = np.array([[0,1,1,2], [0, 5, 0, 0], [2, 0,3,3]], dtype=np.int64)
>>> y = x[x!=0]
>>> y+2
array([3, 3, 4, 7, 4, 5, 5])

关于python - Numpy 将字母评估为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49540308/

相关文章:

python Pandas : extract data from a cell and turn it into a column

Python 文件-IO 和 zipfile。尝试循环遍历文件夹中的所有文件,然后使用Python循环遍历各个文件中的文本

python - 获取行中条件匹配的列名

python - 如何使用Dask.Array.From_Zarr在Dask上打开zarr文件?

python 3.7 numpy 加载 ValueError : cannot reshape array of size 5218288 into shape (1974, 3,128,128,3)

python : How to load column from multiblock csv tables?

python - 使用 Pandas 从 xml url 读取单个节点

python - Geopandas read_file

python - 如何在 Python 中将二维数组的字符串值转换为整数值?

python-3.x - 迭代数据帧的行,但将每一行保留为数据帧