Это для лучшего понимания вещей. Это не актуальная проблема, которую мне нужно исправить. Предполагается, что объект cstringIO
имитирует строку, файл, а также итератор по строкам. Он также имитирует буфер? В любом случае в идеале нужно иметь возможность построить массив numpy следующим образом
import numpy as np
import cstringIO
c = cStringIO.StringIO('\x01\x00\x00\x00\x01\x00\x00\x00')
#Trying the iterartor abstraction
b = np.fromiter(c,int)
# The above fails with: ValueError: setting an array element with a sequence.
#Trying the file abstraction
b = np.fromfile(c,int)
# The above fails with: IOError: first argument must be an open file
#Trying the sequence abstraction
b = np.array(c, int)
# The above fails with: TypeError: long() argument must be a string or a number
#Trying the string abstraction
b = np.fromstring(c)
#The above fails with: TypeError: argument 1 must be string or read-only buffer
b = np.fromstring(c.getvalue(), int) # does work
Мой вопрос в том, почему он так себя ведет.
Практическая проблема, из-за которой это возникло, заключается в следующем: у меня есть итератор, который возвращает кортеж. Я заинтересован в создании массива numpy из одного из компонентов кортежа с минимальным копированием и дублированием, насколько это возможно. Мое первое сокращение заключалось в том, чтобы продолжить запись интересных компонентов полученного кортежа в объект StringIO, а затем использовать его буфер памяти для массива. Я, конечно, могу использовать getvalue ()
, но создам и верну копию. Что было бы хорошим способом избежать лишнего копирования.