Saya memiliki matriks 4x2 dan 2x2. Saya ingin mengulang setiap kombinasi baris (vektor dimensi 2) melalui fungsi foo menggunakan vectorize.

Berikut adalah matriks:

X = np.array([[1, 0], [2, 0], [3, 0], [4,0]])
Y = np.array([[1, 0], [2, 0]])

Inilah cara saya mencoba menjalankannya:

def foo(x, y):
    print("inputs:", x, y)
    return x[0] * y[0]

bar = np.vectorize(foo, signature="???")
output = bar(X, Y)
print(output)

Saya mencari output berikut. bar akan mengembalikan matriks 4x2:

inputs: [1,0] [1,0]
inputs: [1,0] [2,0]
inputs: [2,0] [1,0]
inputs: [2,0] [2,0]
inputs: [3,0] [1,0]
inputs: [3,0] [2,0]
inputs: [4,0] [1,0]
inputs: [4,0] [2,0]
[[1,2], [2,4], [3,6], [4,8]]

Saya telah mencoba berbagai kombinasi signature, tetapi saya tidak mengerti cara menggunakannya mengingat hasil yang saya cari.

NB: Saya sadar vectorize hanya menggunakan loop Python for di bawah tenda dan tidak menawarkan manfaat kinerja. Saya hanya ingin memahami cara menggunakannya.

1
Juicy 5 April 2021, 18:01

1 menjawab

Jawaban Terbaik

Penggunaan dasar vectorize menyiarkan input satu sama lain, dan meneruskan tupel skalar ke fungsi Anda. A (4,2) tidak dapat disiarkan dengan (2,2). signature adalah tambahan yang memungkinkan untuk melewatkan "baris" dari array Anda. Ini bahkan lebih lambat, dan saya belum melihatnya banyak digunakan (atau merekomendasikannya).

In [536]: bar = np.vectorize(foo, signature="(n),(n)->()")

In [533]: bar(X,Y[0,:])
inputs: [1 0] [1 0]
inputs: [2 0] [1 0]
inputs: [3 0] [1 0]
inputs: [4 0] [1 0]
Out[533]: array([1, 2, 3, 4])

In [537]: bar(X[:,None],Y[None])
inputs: [1 0] [1 0]
inputs: [1 0] [2 0]
inputs: [2 0] [1 0]
inputs: [2 0] [2 0]
inputs: [3 0] [1 0]
inputs: [3 0] [2 0]
inputs: [4 0] [1 0]
inputs: [4 0] [2 0]
Out[537]: 
array([[1, 2],
       [2, 4],
       [3, 6],
       [4, 8]])

Jadi ini memberikan bar a (4,1,2) dan (1,2,2); yang disiarkan sebagai (4,2,2). Atau dengan tanda tangan ini menyiarkan (4,1) dengan 1,2) => (4,2). Ini adalah tanda tangan yang menentukan bagaimana dimensi terakhir cocok.

Dalam beberapa kasus mungkin nyaman, tetapi saya tidak akan merekomendasikan mencurahkan terlalu banyak waktu untuk memahami vectorize.

2
hpaulj 5 April 2021, 20:06