Apakah ada cara yang baik untuk membedakan antara baris dan kolom vektor dalam python? Sejauh ini saya'm menggunakan numpy dan scipy dan apa yang saya lihat sejauh ini adalah bahwa Jika saya adalah untuk memberikan satu vektor, mengatakan
from numpy import *
Vector = array([1,2,3])
mereka tidak't dapat mengatakan cuaca maksudku baris atau vektor kolom. Selain itu:
array([1,2,3]) == array([1,2,3]).transpose()
True
Yang di "dunia nyata" adalah tidak benar.
Saya menyadari bahwa sebagian besar dari fungsi vektor dari modul disebutkan don't perlu diferensiasi. Misalnya luar(a,b)
atau a.dot(b)
tapi aku'd ingin membedakan untuk kenyamanan saya sendiri.
Anda dapat membuat perbedaan eksplisit dengan menambahkan dimensi lain untuk array.
>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.transpose()
array([1, 2, 3])
>>> a.dot(a.transpose())
14
Sekarang kekuatan itu menjadi vektor kolom:
>>> a.shape = (3,1)
>>> a
array([[1],
[2],
[3]])
>>> a.transpose()
array([[1, 2, 3]])
>>> a.dot(a.transpose())
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
Pilihan lain adalah dengan menggunakan np.newaxis ketika anda ingin membuat perbedaan:
>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a[:, np.newaxis]
array([[1],
[2],
[3]])
>>> a[np.newaxis, :]
array([[1, 2, 3]])
Vektor yang anda buat adalah baik baris atau kolom. Itu benar-benar memiliki 1 dimensi saja. Anda dapat memverifikasi bahwa oleh
myvector.ndim
yang merupakan 1
myvector.bentuk
, yang merupakan (3,)
(sebuah tuple dengan satu elemen saja). Untuk vektor baris adalah harus (1, 3)
, dan untuk kolom (3, 1)
Dua cara untuk menangani hal ini
membentuk kembali
satu anda saat iniAnda secara eksplisit dapat membuat baris atau kolom
row = np.array([ # one row with 3 elements
[1, 2, 3]
]
column = np.array([ # 3 rows, with 1 element each
[1],
[2],
[3]
])
atau, dengan shortcut
row = np.r_['r', [1,2,3]] # shape: (1, 3)
column = np.r_['c', [1,2,3]] # shape: (3,1)
Atau, anda dapat membentuk kembali untuk (1, n)
untuk baris, atau (n, 1)
untuk kolom
row = my_vector.reshape(1, -1)
column = my_vector.reshape(-1, 1)
di mana -1
secara otomatis menemukan nilai n
.
Saya pikir anda dapat menggunakan ndmin pilihan numpy.array. Menjaga ke 2 mengatakan bahwa itu akan menjadi a (4,1) dan transpos akan (1,4).
>>> a = np.array([12, 3, 4, 5], ndmin=2)
>>> print a.shape
>>> (1,4)
>>> print a.T.shape
>>> (4,1)
Jika anda ingin distiction untuk kasus ini, saya akan merekomendasikan untuk menggunakan matrix
sebaliknya, dimana:
matrix([1,2,3]) == matrix([1,2,3]).transpose()
memberikan:
matrix([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
Anda juga dapat menggunakan ndarray
secara eksplisit menambahkan dimensi kedua:
array([1,2,3])[None,:]
#array([[1, 2, 3]])
dan:
array([1,2,3])[:,None]
#array([[1],
# [2],
# [3]])
Jika saya ingin 1x3 array, atau 3x1 array:
import numpy as np
row_arr = np.array([1,2,3]).reshape((1,3))
col_arr = np.array([1,2,3]).reshape((3,1)))
Periksa pekerjaan anda:
row_arr.shape #returns (1,3)
col_arr.shape #returns (3,1)
Saya menemukan banyak jawaban di sini adalah membantu, tapi terlalu rumit untuk saya. Dalam praktek saya datang kembali ke bentuk
dan membentuk kembali
dan kode lebih mudah dibaca: sangat sederhana dan eksplisit.
Sepertinya Python's Numpy doesn't membedakannya kecuali jika anda menggunakannya dalam konteks:
"Anda dapat memiliki standar vektor atau baris/kolom vektor jika anda suka. "
" :) Anda dapat mengobati peringkat-1 array sebagai salah satu baris atau kolom vektor. titik(A,v) memperlakukan v sebagai vektor kolom, sedangkan titik(v,A) memperlakukan v sebagai vektor baris. Hal ini dapat menyelamatkan anda dari harus banyak transposes. "
Juga, khusus untuk anda kode: "Transpose pada peringkat ke-1 array tidak apa-apa. " Sumber: http://wiki.scipy.org/NumPy_for_Matlab_Users
Anda dapat menyimpan array's-unsur dalam satu baris atau kolom sebagai berikut:
>>> a = np.array([1, 2, 3])[:, None] # stores in rows
>>> a
array([[1],
[2],
[3]])
>>> b = np.array([1, 2, 3])[None, :] # stores in columns
>>> b
array([[1, 2, 3]])
Ketika saya mencoba untuk menghitung w^T * x
menggunakan numpy, itu sangat membingungkan untuk saya juga. Pada kenyataannya, saya tidak't menerapkannya sendiri. Jadi, ini adalah salah satu dari beberapa gotchas di NumPy bahwa kita perlu memperkenalkan diri dengan.
Sejauh 1D array adalah yang bersangkutan, tidak tidak ada perbedaan antara vektor baris dan vektor kolom. Mereka persis sama.
Lihatlah contoh-contoh berikut ini, di mana kami mendapatkan hasil yang sama dalam semua kasus, yang tidak benar di (teoritis rasa) aljabar linear:
In [37]: w
Out[37]: array([0, 1, 2, 3, 4])
In [38]: x
Out[38]: array([1, 2, 3, 4, 5])
In [39]: np.dot(w, x)
Out[39]: 40
In [40]: np.dot(w.transpose(), x)
Out[40]: 40
In [41]: np.dot(w.transpose(), x.transpose())
Out[41]: 40
In [42]: np.dot(w, x.transpose())
Out[42]: 40
Dengan informasi itu, sekarang mari's mencoba untuk menghitung kuadrat panjang vektor |w|^2
.
Untuk ini, kita perlu mengubah w
untuk 2D array.
In [51]: wt = w[:, np.newaxis]
In [52]: wt
Out[52]:
array([[0],
[1],
[2],
[3],
[4]])
Sekarang, let's menghitung kuadrat panjang (atau kuadrat magnitude) dari vektor w
:
In [53]: np.dot(w, wt)
Out[53]: array([30])
Perhatikan bahwa kita menggunakan w
, berat
, bukan wt
, w
(seperti dalam teori aljabar linear) karena bentuk ketidakcocokan dengan menggunakan np.dot(wt, w). Jadi, kami telah kuadrat panjang vektor sebagai [30]
. Mungkin ini adalah salah satu cara untuk membedakan (numpy's interpretasi) baris dan vektor kolom?
Dan akhirnya, apakah saya menyebutkan bahwa saya tahu cara untuk menerapkan w^T * x
? Ya, saya lakukan :
In [58]: wt
Out[58]:
array([[0],
[1],
[2],
[3],
[4]])
In [59]: x
Out[59]: array([1, 2, 3, 4, 5])
In [60]: np.dot(x, wt)
Out[60]: array([40])
Jadi, di NumPy, urutan operan terbalik, seperti yang dibuktikan di atas, bertentangan dengan apa yang kita pelajari dalam teori aljabar linear.
P. S. : potensi gotchas di numpy
Berikut ini's cara yang intuitif. Misalkan kita memiliki:
>>> a = np.array([1, 3, 4])
>>> a
array([1, 3, 4])
Pertama kita membuat 2D array dengan itu sebagai satu-satunya baris:
>>> a = np.array([a])
>>> a
array([[1, 3, 4]])
Maka kita dapat mengubahnya:
>>> a.T
array([[1],
[3],
[4]])
Setiap Panda perpustakaan menambah fitur untuk numpy yang membuat jenis-jenis operasi yang lebih intuitif IMO. Misalnya:
import numpy as np
import pandas as pd
# column
df = pd.DataFrame([1,2,3])
# row
df2 = pd.DataFrame([[1,2,3]])
Anda bahkan dapat menentukan DataFrame dan membuat spreadsheet seperti pivot table.