In [588]: x,y=np.ogrid[-1:1:5*1j,-1:1:5*1j]
In [589]: z=x*y*1j
In [590]: def setcolor(z):
return (z.real,z.imag,np.abs(z))
.....:
In [591]: fn=np.frompyfunc(setcolor,1,1)
In [592]: fn(z)
Out[592]:
array([[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]], dtype=object)
yang berubah menjadi array 0 dengan .astype(float)
. Di sini setcolor
hanyalah cara sederhana untuk mendapatkan 3 angka dari input kompleks. Anda dapat memilih sesuatu yang lebih realistis.
Namun jika kita memberikan hitungan out
yang benar, kita mendapatkan serangkaian array.
In [593]: fn=np.frompyfunc(setcolor,1,3)
In [594]: fn(z)
Out[594]:
(array([[0.0, 0.0, -0.0, -0.0, -0.0],
[0.0, 0.0, -0.0, -0.0, -0.0],
[-0.0, -0.0, 0.0, 0.0, 0.0],
[-0.0, -0.0, 0.0, 0.0, 0.0],
[-0.0, -0.0, 0.0, 0.0, 0.0]], dtype=object),
array([[1.0, 0.5, 0.0, -0.5, -1.0],
[0.5, 0.25, 0.0, -0.25, -0.5],
[0.0, 0.0, 0.0, 0.0, 0.0],
[-0.5, -0.25, 0.0, 0.25, 0.5],
[-1.0, -0.5, 0.0, 0.5, 1.0]], dtype=object),
array([[1.0, 0.5, 0.0, 0.5, 1.0],
[0.5, 0.25, 0.0, 0.25, 0.5],
[0.0, 0.0, 0.0, 0.0, 0.0],
[0.5, 0.25, 0.0, 0.25, 0.5],
[1.0, 0.5, 0.0, 0.5, 1.0]], dtype=object))
Itu bisa diubah menjadi array (3,N,N) dengan:
np.array([A.astype(float) for A in fn(z)])
Anda harus melakukan transpose untuk membuat array (N,N,3).
Untuk sampel kecil ini, ini tidak lebih cepat
In [599]: timeit np.array([A.astype(float) for A in fn(z)]).transpose([1,2,0])
1000 loops, best of 3: 664 µs per loop
In [603]: %%timeit
.....: img=np.zeros((5,5,3),float)
.....: for i in range(5):
for j in range(5):
img[i,j]=setcolor(z[i,j])
.....:
1000 loops, best of 3: 316 µs per loop
Dalam beberapa pertanyaan SO lainnya saya menemukan bahwa frompyfunc
lebih cepat dari vectorize
, dan sedikit peningkatan dibandingkan iterasi langsung.
Ini lebih cepat - tetapi tidak berhasil
In [606]: timeit np.frompyfunc(setcolor,1,1)(z).astype(float)
10000 loops, best of 3: 25.6 µs per loop
setcolor
yang saya pilih dapat mengambil array z
secara langsung, sehingga menghasilkan pembuatan array 3d yang cepat.
In [608]: timeit np.array([A.astype(float) for A in setcolor(z)]).transpose([1,2,0])
10000 loops, best of 3: 47.1 µs per loop
Dari https://stackoverflow.com/a/29703463/901925, jawaban sebelumnya yang melibatkan frompystack
, saya menemukan bahwa vstack
adalah cara yang lebih cepat untuk merakit Tuple menjadi array 3d:
In [616]: timeit np.vstack(fn(z)).astype(float).reshape(3,5,5).transpose([1,2,0])
10000 loops, best of 3: 178 µs per loop
Jika dilakukan dengan benar, frompyfunc
dapat memberikan kecepatan sekitar 2x dibandingkan iterasi eksplisit, namun masih belum sebaik fungsi yang menangani array secara langsung.
person
hpaulj
schedule
29.03.2016
frompyfunc
tidak akan mempercepat kode Anda ... asal tahu saja - person Joran Beasley   schedule 30.03.2016numpy.frompyfunc(setcolor,1,1)(z)
(untukN
kecil)?frompyfunc
, jika berfungsi, mungkin memberikan kecepatan sebanyak 2x, tetapi tidak seperti vektorisasi asli. - person hpaulj   schedule 30.03.2016numpy.frompyfunc
tampaknya memiliki masalah dengan fungsi yang sudah mengembalikan urutan. Sepertinya itu mungkin bug NumPy. Anda mungkin sebaiknya tidak menggunakanfrompyfunc
. - person user2357112 supports Monica   schedule 30.03.2016