在 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/