Misalkan saya memiliki numpy array:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
dan saya memiliki yang sesuai "vektor:"
vector = np.array([1,2,3])
Bagaimana saya beroperasi pada data
di sepanjang setiap baris untuk mengurangi atau membagi jadi hasilnya adalah:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
Singkat cerita: Bagaimana saya melakukan operasi pada setiap baris dari 2D array dengan 1D array skalar yang sesuai untuk setiap baris?
Di sini anda pergi. Anda hanya perlu menggunakan None
(atau np.newaxis
) yang dikombinasikan dengan penyiaran:
In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
Seperti yang telah disebutkan, mengiris dengan Tidak
atau dengan np.newaxes
adalah cara yang bagus untuk melakukan hal ini.
Alternatif lain adalah dengan menggunakan transposes dan penyiaran, seperti di
(data.T - vector).T
dan
(data.T / vector).T
Untuk tinggi dimensi array anda mungkin ingin menggunakan swapaxes
metode NumPy array atau NumPy rollaxis
fungsi.
Sebenarnya ada banyak cara untuk melakukan hal ini.
Untuk penjelasan lebih lengkap tentang penyiaran, lihat http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
JoshAdel's solusi menggunakan np.newaxis untuk menambahkan dimensi. Alternatif lain adalah dengan menggunakan membentuk() untuk menyelaraskan dimensi dalam persiapan untuk penyiaran.
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data
# array([[1, 1, 1],
# [2, 2, 2],
# [3, 3, 3]])
vector
# array([1, 2, 3])
data.shape
# (3, 3)
vector.shape
# (3,)
data / vector.reshape((3,1))
# array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])
Melakukan reshape() memungkinkan dimensi untuk berbaris untuk penyiaran:
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
Perhatikan bahwa data/vektorok, tapi itu doesn't membuat anda mendapatkan jawaban yang anda inginkan. Membagi masing-masing *kolom* dari
array(bukan masing-masing *baris*) oleh masing-masing unsur terkait dari
vektor. It's apa yang akan anda dapatkan jika anda secara eksplisit dibentuk kembali
vektormenjadi
1x3bukan
3x1`.
data / vector
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
Pythonic cara untuk melakukan ini adalah ...
np.divide(data,vector)
Ini mengurus membentuk kembali dan juga hasil yang di format floating point. Di lain hasil jawaban dalam format bilangan bulat.
#CATATAN: Tidak ada kolom di kedua data dan vektor harus sesuai
Menambahkan jawaban dari stackoverflowuser2010, dalam kasus umum anda hanya dapat menggunakan
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
Ini akan mengubah vektor menjadi kolom matriks/vektor
. Memungkinkan anda untuk melakukan elementwise operasi seperti yang anda inginkan. Setidaknya untuk saya, ini adalah cara yang paling intuitif untuk pergi tentang itu dan sejak (dalam kebanyakan kasus) numpy hanya akan menggunakan tampilan yang sama memori internal untuk membentuk's efisien juga.