np.array
の呼び出しごとに配列の 1 つの行を生成する、python ジェネレーターからのサンプリングによって構築しようとしていますnext
。サンプルコードは次のとおりです。
import numpy as np
data = np.eye(9)
labels = np.array([0,0,0,1,1,1,2,2,2])
def extract_one_class(X,labels,y):
""" Take an array of data X, a column vector array of labels, and one particular label y. Return an array of all instances in X that have label y """
return X[np.nonzero(labels[:] == y)[0],:]
def generate_points(data, labels, size):
""" Generate and return 'size' pairs of points drawn from different classes """
label_alphabet = np.unique(labels)
assert(label_alphabet.size > 1)
for useless in xrange(size):
shuffle(label_alphabet)
first_class = extract_one_class(data,labels,label_alphabet[0])
second_class = extract_one_class(data,labels,label_alphabet[1])
pair = np.hstack((first_class[randint(0,first_class.shape[0]),:],second_class[randint(0,second_class.shape[0]),:]))
yield pair
points = np.fromiter(generate_points(data,labels,5),dtype = np.dtype('f8',(2*data.shape[1],1)))
このextract_one_class
関数は、データのサブセットを返します。つまり、1 つのクラス ラベルに属するすべてのデータ ポイントです。ポイントをnp.array
withにしたいと思いshape = (size,data.shape[1])
ます。現在、上記のコード スニペットはエラーを返します。
ValueError: setting an array element with a sequence.
fromiter
1 次元配列を返すと主張するドキュメント。さらに、以前に fromiter を使用して numpy でレコード配列を構築した人もいます (例: http://iam.al/post/21116450281/numpy-is-my-homeboy )。
この方法で配列を生成できると仮定して、私は的外れですか? または、私のnumpyはまったく正しくありませんか?