Есть ли хороший способ различать векторы строк и векторы столбцов в python? Пока что я использую numpy и scipy, и пока что я вижу, что если я дам вектор, скажем.
from numpy import *
Vector = array([1,2,3])
они не смогут сказать, что я имею в виду - вектор строк или вектор столбцов. Более того:
array([1,2,3]) == array([1,2,3]).transpose()
True
Что в "реальном мире" просто неправда.
Я понимаю, что большинство функций на векторах из упомянутых модулей не нуждаются в дифференцировании. Например, outer(a,b)
или a.dot(b)
, но я'хотел бы дифференцировать для собственного удобства.
Вы можете сделать различие явным, добавив к массиву еще одно измерение.
>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.transpose()
array([1, 2, 3])
>>> a.dot(a.transpose())
14
Теперь заставим его быть вектором-столбцом:
>>> 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]])
Другой вариант - использовать np.newaxis, когда вы хотите сделать различие:
>>> 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]])
Используйте Double []
при написании собственных векторов.
Затем, если вы хотите вектора-строки:
row_vector = array([[1, 2, 3]]) # shape (1, 3)
Или, если хотите, вектор-столбец:
col_vector = array([[1, 2, 3]]).T # shape (3, 1)
Вектор, который вы создаете, является ни строк, ни столбцов. Это на самом деле имеет только 1 размер. Вы можете проверить это
, который является
1`myvector.форму
, которая (3,)
(кортеж с одним элементом). Для вектора-строки должен быть (1, 3), а для столбца
(3, 1)`Два способа справиться с этим
перекроить
текущийВы можете явно создать строку или столбец
row = np.array([ # one row with 3 elements
[1, 2, 3]
]
column = np.array([ # 3 rows, with 1 element each
[1],
[2],
[3]
])
или с ярлыка
row = np.r_['r', [1,2,3]] # shape: (1, 3)
column = np.r_['c', [1,2,3]] # shape: (3,1)
Кроме того, вы можете изменить его на (1, п)
для строки или (Н, 1)
для столбца
row = my_vector.reshape(1, -1)
column = my_vector.reshape(-1, 1)
где -1
автоматически находит значение "N".
Я думаю, что вы можете использовать ndmin вариант и NumPy.массив. Держа его на 2 говорит, что это будет (4,1) и перенести будет (1,4).
>>> a = np.array([12, 3, 4, 5], ndmin=2)
>>> print a.shape
>>> (1,4)
>>> print a.T.shape
>>> (4,1)
Если вам нужна дистинкция для этого случая, я бы рекомендовал вместо нее использовать матрицу
, где:
matrix([1,2,3]) == matrix([1,2,3]).transpose()
дает:
matrix([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
Вы также можете использовать ndarray
, явно добавляя второе измерение:
array([1,2,3])[None,:]
#array([[1, 2, 3]])
и:
array([1,2,3])[:,None]
#array([[1],
# [2],
# [3]])
Если я хочу массив 1х3 или 3х1 массива:
import numpy as np
row_arr = np.array([1,2,3]).reshape((1,3))
col_arr = np.array([1,2,3]).reshape((3,1)))
Проверьте свою работу:
row_arr.shape #returns (1,3)
col_arr.shape #returns (3,1)
Я нашел много ответов здесь полезны, но слишком сложно для меня. На практике я вернусь в форме
и изменить
и код читается: очень простые и явные.
Похоже, что Python'Numpy не различает его, пока вы не используете его в контексте:
"Вы можете иметь стандартные векторы или векторы строк/столбцов, если хотите. "
" :) Вы можете рассматривать массивы ранга 1 как строчные или столбцовые векторы. dot(A,v) рассматривает v как столбцовый вектор, а dot(v,A) рассматривает v как строчный вектор. Это может избавить вас от необходимости вводить много транспозиций"
Также, специфично для вашего кода: "Transpose на массиве ранга-1 ничего не делает. " Источник: http://wiki.scipy.org/NumPy_for_Matlab_Users
Вы можете хранить массив's элементов в строке или столбце следующим образом:
>>> 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]])
Когда я попытался вычислить ш^т * х
с помощью библиотеки numpy, это было очень запутанным для меня. На самом деле, я не мог'т реализовать это сам. Так вот, это один из немногих подводных камней в пакете numpy, что мы должны знакомить себя.
Насколько заинтересованными массив 1Д*, нет нет различия между вектор-строку и вектор-столбец. Они точно такие же.
Посмотрите на следующие примеры, где мы получаем тот же самый результат во всех случаях, чего не скажешь в (в теоретическом смысле) линейная алгебра:
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
С этой информацией, теперь давайте's попытаться вычислить квадрат длины вектора |Ж|^2
.
Для этого нам нужно преобразовать Вт
в 2D массива.
In [51]: wt = w[:, np.newaxis]
In [52]: wt
Out[52]:
array([[0],
[1],
[2],
[3],
[4]])
Теперь давайте'ы вычислить квадрат длины (или квадрат величины) вектора ж
:
In [53]: np.dot(w, wt)
Out[53]: array([30])
Обратите внимание, что мы использовали Вт
, вес
вместо мас
, ж
(как в теоретическом, линейная алгебра) из-за несоответствия формы с использованием НП.точка(Вт, Вт). Итак, у нас есть квадрат длины вектора а [30]
. Может быть, это один из способов отличить (включает'интерпретация) строку и вектор-столбец?
И, наконец, я упоминал, что я вычислил способ реализации ш^т * х
? Да, я сделал :
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])
Так, в пакете numpy, порядок операндов восстанавливается, о чем свидетельствуют выше, вопреки тому, что мы изучали в теоретической линейной алгебры.
Здесь'с другой интуитивно понятным способом. Предположим, что мы имеем:
>>> a = np.array([1, 3, 4])
>>> a
array([1, 3, 4])
Сначала мы сделать 2D массив, что как только строки:
>>> a = np.array([a])
>>> a
array([[1, 3, 4]])
Тогда мы сможем перенести ее:
>>> a.T
array([[1],
[3],
[4]])
Отличный панды библиотека добавляет функции библиотеки numpy, которые делают эти операции более интуитивным ИМО. Например:
import numpy as np
import pandas as pd
# column
df = pd.DataFrame([1,2,3])
# row
df2 = pd.DataFrame([[1,2,3]])
Вы даже сможете определить таблицы данных и создать таблицу-как сводная таблица](http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-pivot).