Массив Numpy из объекта cStringIO и избегание копий

Это для лучшего понимания вещей. Это не актуальная проблема, которую мне нужно исправить. Предполагается, что объект 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 () , но создам и верну копию. Что было бы хорошим способом избежать лишнего копирования.

5
задан san 24 June 2011 в 06:46
поделиться