为什么我不能重塑 numpy 字符串数组和 ctype 数组?
Why can't I reshape numpy string arrays and ctype arrays?
也许我缺少解决此问题的方法。长话短说,我需要一个大文本文件的只读共享内存访问。使用字符串当然是必要的。所以我正在尝试这样做:
import numpy
from multiprocessing import Pool, RawArray
if __name__ == '__main__':
with open('test.txt', 'r') as fin:
raw = fin.readlines()
X_shape = (len(raw), 70) # 70 characters per line should be sufficient for my needs
X = RawArray('c', X_shape[0] * X_shape[1])
X_np = np.frombuffer(X).reshape(X_shape)
numpy.copyto(X_np, raw)
这不起作用,它在倒数第二行失败,输出如下:
ValueError: cannot reshape array of size 102242175 into shape (11684820,70)
作为参考,文件示例的长度为 11684820 行。并且 11684820 * 70 绝对不是数组声称其大小适合的字符数。
显然我一定是做错了什么,但这是我认为唯一可行的方法,可以使用低端几百兆字节的文本文件的文本文件输入来多处理一些 CPU 绑定计算,并且高端大约 6 GB。
是否有变通办法,或者是否有更正确的方法,以便我可以在共享内存中拥有大量字符串,我可以使用 python 代码?谢谢
numpy.frombuffer
需要明确的 dtype,否则它将默认为 dtype=float
。此外,一个 11684820x70 的 uint8 数组或 1 个字符的字节串与一个长度为 11684820 的 70 个字符的字节串数组不同,所以请记住这一点。
对于 11684820x70 阵列,您要求的形状,但可能不是您需要的形状:
X_np = np.frombuffer(X, dtype=np.uint8).reshape(X_shape)
对于 dtype S70 的长度为 11684820 的数组(最大长度为 70 的空终止字节串,在 NumPy 文档中描述为 "not recommended"):
X_np = np.frombuffer(X, dtype='S70')
对于长度为 11684820 的 dtype U70 数组(最大长度为 70 的空终止 Unicode 字符串),您需要更大的缓冲区(每个字符 4 个字节),然后
X_np = np.frombuffer(X, dtype='U70')
也许我缺少解决此问题的方法。长话短说,我需要一个大文本文件的只读共享内存访问。使用字符串当然是必要的。所以我正在尝试这样做:
import numpy
from multiprocessing import Pool, RawArray
if __name__ == '__main__':
with open('test.txt', 'r') as fin:
raw = fin.readlines()
X_shape = (len(raw), 70) # 70 characters per line should be sufficient for my needs
X = RawArray('c', X_shape[0] * X_shape[1])
X_np = np.frombuffer(X).reshape(X_shape)
numpy.copyto(X_np, raw)
这不起作用,它在倒数第二行失败,输出如下:
ValueError: cannot reshape array of size 102242175 into shape (11684820,70)
作为参考,文件示例的长度为 11684820 行。并且 11684820 * 70 绝对不是数组声称其大小适合的字符数。
显然我一定是做错了什么,但这是我认为唯一可行的方法,可以使用低端几百兆字节的文本文件的文本文件输入来多处理一些 CPU 绑定计算,并且高端大约 6 GB。
是否有变通办法,或者是否有更正确的方法,以便我可以在共享内存中拥有大量字符串,我可以使用 python 代码?谢谢
numpy.frombuffer
需要明确的 dtype,否则它将默认为 dtype=float
。此外,一个 11684820x70 的 uint8 数组或 1 个字符的字节串与一个长度为 11684820 的 70 个字符的字节串数组不同,所以请记住这一点。
对于 11684820x70 阵列,您要求的形状,但可能不是您需要的形状:
X_np = np.frombuffer(X, dtype=np.uint8).reshape(X_shape)
对于 dtype S70 的长度为 11684820 的数组(最大长度为 70 的空终止字节串,在 NumPy 文档中描述为 "not recommended"):
X_np = np.frombuffer(X, dtype='S70')
对于长度为 11684820 的 dtype U70 数组(最大长度为 70 的空终止 Unicode 字符串),您需要更大的缓冲区(每个字符 4 个字节),然后
X_np = np.frombuffer(X, dtype='U70')