Python: Различие между векторами строк и векторами столбцов

Есть ли хороший способ различать векторы строк и векторы столбцов в 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), но я'хотел бы дифференцировать для собственного удобства.

Комментарии к вопросу (3)
Решение

Вы можете сделать различие явным, добавив к массиву еще одно измерение.

>>> 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]])
Комментарии (3)

Используйте Double [] при написании собственных векторов.

Затем, если вы хотите вектора-строки:

row_vector = array([[1, 2, 3]])    # shape (1, 3)

Или, если хотите, вектор-столбец:

col_vector = array([[1, 2, 3]]).T  # shape (3, 1)
Комментарии (0)

Вектор, который вы создаете, является ни строк, ни столбцов. Это на самом деле имеет только 1 размер. Вы можете проверить это

  • проверка количества myvector измерений.ndim, который является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".

Комментарии (1)

Я думаю, что вы можете использовать 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)
Комментарии (0)

Если вам нужна дистинкция для этого случая, я бы рекомендовал вместо нее использовать матрицу, где:

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]])
Комментарии (2)

Если я хочу массив 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)

Я нашел много ответов здесь полезны, но слишком сложно для меня. На практике я вернусь в форме и изменить и код читается: очень простые и явные.

Комментарии (0)

Похоже, что Python'Numpy не различает его, пока вы не используете его в контексте:

"Вы можете иметь стандартные векторы или векторы строк/столбцов, если хотите. "

" :) Вы можете рассматривать массивы ранга 1 как строчные или столбцовые векторы. dot(A,v) рассматривает v как столбцовый вектор, а dot(v,A) рассматривает v как строчный вектор. Это может избавить вас от необходимости вводить много транспозиций"

Также, специфично для вашего кода: "Transpose на массиве ранга-1 ничего не делает. " Источник: http://wiki.scipy.org/NumPy_for_Matlab_Users

Комментарии (1)

Вы можете хранить массив'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]])
Комментарии (0)

векторы строки (1,0) тензора, вектора (0, 1) тензора. при использовании V = НП.массив([[1,2,3]]), В стали (0,2) тензора. Извините, я перепутал.

Комментарии (0)

Когда я попытался вычислить ш^т * х с помощью библиотеки 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, порядок операндов восстанавливается, о чем свидетельствуют выше, вопреки тому, что мы изучали в теоретической линейной алгебры.


П. С. : потенциальные проблемы в пакете numpy

Комментарии (1)

Здесь'с другой интуитивно понятным способом. Предположим, что мы имеем:

>>> 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]])
Комментарии (0)

Отличный панды библиотека добавляет функции библиотеки 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).

Комментарии (1)