将字符串添加到二维数组时出现问题
Problems adding strings to 2D array
所以我只是尝试使用 for 循环将某些字符串添加到 NxN 数组(矩阵)中。首先,我使用 np.empty 创建一个空的二维数组,稍后用我的值填充:
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])),dtype=str)
for i in range(imgL.shape[0]):
for j in range(imgL.shape[1]):
matrixK[i][j] = 'ab'+ 'cd'
当我 运行 这段代码时,我得到了一个正确的 NxN 数组矩阵 K,但是它在所有索引处只填充了 'a' 而不是 'abcd'。所以基本上总是只有字符串的第一个字符而不是整个字符串。我想数组的数据类型有问题但不知道是什么,因为我将数据类型指定为 str
现在我只是尝试用 'ab'+'cd' 之类的字符串填充数组进行测试,实际上这些字符串是从其他数组中获取的字符串
由于 numpy 数组为数组中的值分配内存,因此您的空字符串被分配为 dtype='<U1'
,这不足以存储长度 >= 2 的字符串。
您需要使用 object
而不是 str
,这将为数组中的 PyObject
指针分配内存,其中数据类型是 python 对象,可以被取消引用为您想要的完整 python 字符串。
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])), dtype=object)
编辑
如果您事先知道字符串的大小,您也可以使用 <U4
分配内存以在每个位置最多容纳 4 个字符。
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])), dtype='<U4')
至于为什么使用 dtype=str
不起作用,numpy 试图聪明地在数组中不使用 PyObject
,这样元素在内存中是连续的。这是 numpy 的行为,因为它的主要用例是存储数值,当值在内存中连续时矩阵运算更有效,而不是必须取消引用 PyObject
指针(Python 的默认行为)。但是由于出于内存分配的目的,数组需要具有元素的数据类型,因此 numpy 从输入中推断并将其表示为 <U1
对于空字符串的情况。
在 lower-level 语言中,您将面临同样的问题,即必须分配指向 char array/string 的指针或分配具有预定义长度的字符串。
所以我只是尝试使用 for 循环将某些字符串添加到 NxN 数组(矩阵)中。首先,我使用 np.empty 创建一个空的二维数组,稍后用我的值填充:
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])),dtype=str)
for i in range(imgL.shape[0]):
for j in range(imgL.shape[1]):
matrixK[i][j] = 'ab'+ 'cd'
当我 运行 这段代码时,我得到了一个正确的 NxN 数组矩阵 K,但是它在所有索引处只填充了 'a' 而不是 'abcd'。所以基本上总是只有字符串的第一个字符而不是整个字符串。我想数组的数据类型有问题但不知道是什么,因为我将数据类型指定为 str
现在我只是尝试用 'ab'+'cd' 之类的字符串填充数组进行测试,实际上这些字符串是从其他数组中获取的字符串
由于 numpy 数组为数组中的值分配内存,因此您的空字符串被分配为 dtype='<U1'
,这不足以存储长度 >= 2 的字符串。
您需要使用 object
而不是 str
,这将为数组中的 PyObject
指针分配内存,其中数据类型是 python 对象,可以被取消引用为您想要的完整 python 字符串。
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])), dtype=object)
编辑
如果您事先知道字符串的大小,您也可以使用 <U4
分配内存以在每个位置最多容纳 4 个字符。
matrixK = np.empty(((imgL.shape[0], imgL.shape[1])), dtype='<U4')
至于为什么使用 dtype=str
不起作用,numpy 试图聪明地在数组中不使用 PyObject
,这样元素在内存中是连续的。这是 numpy 的行为,因为它的主要用例是存储数值,当值在内存中连续时矩阵运算更有效,而不是必须取消引用 PyObject
指针(Python 的默认行为)。但是由于出于内存分配的目的,数组需要具有元素的数据类型,因此 numpy 从输入中推断并将其表示为 <U1
对于空字符串的情况。
在 lower-level 语言中,您将面临同样的问题,即必须分配指向 char array/string 的指针或分配具有预定义长度的字符串。