通常、繰り返しで配列を作成するときには、値をリストに集めてその配列を作成します。または空のリストを割り当てて値をスロットに割り当てます。ここ
は、発電機は、アレイのタプルを返す割り当てを、行うための方法だ:
def mk_array(N):
for i in range(N):
img=np.ones((2,3,3),int)
L=img[:,:,:1]*i
ab=img[:,:,1:].astype(float)*i/10
yield L,ab
Iは、int型の配列、浮動小数点数の他の配列を作りました。それは、それらを1つに結びつける誘惑を減らす。
In [157]: g=mk_array(4)
In [158]: for i,v in enumerate(g):
print(v[0].shape,v[1].shape)
.....:
(2, 3, 1) (2, 3, 2)
(2, 3, 1) (2, 3, 2)
(2, 3, 1) (2, 3, 2)
(2, 3, 1) (2, 3, 2)
正しい形状のターゲット配列を割り当てます。ここで私は第三軸繰返しを置くが、それはどこでも
In [159]: L, ab = np.empty((2,3,4,1),int), np.empty((2,3,4,2),float)
In [160]: for i,v in enumerate(g):
L[...,i,:], ab[...,i,:] = v
私の推測可能性があり、これは任意のfromiter
かstack
代替と同じくらい速いです。そして、ファイルから読み込むことによってコンポーネントが生成されると、そのステップは最もコストがかかるものになります。反復メカニズムや配列のコピーよりも多くのことが行われます。
================
イテレータがスカラーのタプルを返した場合、我々はfromiter
を使用することができます。
def mk_array1(N):
for i in range(N):
img=np.ones((2,3,3),int)
L=img[:,:,:1]*i
ab=img[:,:,1:].astype(float)*i/10
for i,j in zip(L.ravel(),ab.ravel()):
yield i,j
In [184]: g=mk_array1(2)
In [185]: V=np.fromiter(g,dtype=('i,f'))
1dの構造化された配列を生成します
In [187]: V['f0']
Out[187]: array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], dtype=int32)
In [188]: V.reshape(2,2,3)['f0']
Out[188]:
array([[[0, 0, 0],
[0, 0, 0]],
[[1, 1, 1],
[1, 1, 1]]], dtype=int32)
In [189]: V.reshape(2,2,3)['f1']
Out[189]:
array([[[ 0. , 0. , 0. ],
[ 0. , 0. , 0. ]],
[[ 0.1, 0.1, 0.1],
[ 0.1, 0.1, 0.1]]], dtype=float32)
:再形成、およびアレイは、フィールド名によって分離することができる
In [186]: V
Out[186]:
array([(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0),
(1, 0.10000000149011612), (1, 0.10000000149011612),
(1, 0.10000000149011612), (1, 0.10000000149011612),
(1, 0.10000000149011612), (1, 0.10000000149011612)],
dtype=[('f0', '<i4'), ('f1', '<f4')])
In [200]: dt=np.dtype([('f0',int,(2,3,1)),('f1',float,(2,3,2))])
In [201]: g=mk_array(2) # the original generator
In [202]: V=np.fromiter(g,dtype=dt)
In [203]: V['f0']
Out[203]:
array([[[[0],
[0],
[0]],
....
[[1],
[1],
[1]]]])
In [204]: _.shape
Out[204]: (2, 2, 3, 1)
のこの使用を:私はより複雑dtype
、各フィールドはアレイを有するものを定義する場合、どのよう
================
fromiter
の化合物dtypeもhttps://stackoverflow.com/a/12473478/901925
に記載されています。これは実際にタプルのリストから構造化された配列を構築する通常の方法のバリエーションです。私たちは2つのアレイを作成する二つの方法の時間をすることができ要するに
np.array([tuple(x) for x in something], dtype=dt)
:N
の広い範囲のために
def foo1(N):
g = mk_array(N)
L, ab = np.empty((N,2,3,1),int), np.empty((N,2,3,2),float)
for i,v in enumerate(g):
L[i,...], ab[i,...] = v
return L, ab
def foo2(N):
dt=np.dtype([('f0',int,(2,3,1)),('f1',float,(2,3,2))])
g = mk_array(N)
V=np.fromiter(g, dtype=dt)
return V['f0'], V['f1']
これら2つの機能はほぼ同じ時間がかかり、私が式を使用しまし回以上。私はfoo1
の利点を開始する前に1秒にランタイムをプッシュする必要があります。
申し訳ありませんが、インポートステートメントを追加しました – BigBoy1337
['np.fromiter'](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.fromiter.html)は、配列の要素* 1つの配列*だからあなたのコードは実際に2要素のタプルの配列を作ることを試みています....私はあなたが現在しようとしていることをする方法を見つけようとしています... –
'X'に' L'配列、 'y'は' ab'配列ですか? – unutbu