Korzystając z numpy, chcę wiele matrycy x za pomocą tablicy kolumnowej y, ElementWise:

   x = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
   y = numpy.array([1, 2, 3])
   z = numpy.multiply(x, y)
   print z

Daje to wyjście, jak y jest tablicą wiersza:

   [[ 1  4  9]
    [ 4 10 18]
    [ 7 16 27]]

Chcę jednak wyjście, jak y jest tablicą kolumnową:

   [[ 1  2  3]
    [ 8 10 12]
    [21 24 27]]

Więc jak mogę manipulować y, aby to osiągnąć? Jeśli używam:

y = numpy.transpose(y)

Następnie y pozostaje taki sam kształt.

1
Karnivaurus 13 sierpień 2014, 20:16

4 odpowiedzi

Najlepsza odpowiedź

Załącz go na innej liście, aby utworzyć 2d:

>>> y2 = numpy.transpose([y])
>>> y2
array([[1],
       [2],
       [3]])
>>> numpy.multiply(x, y2)
array([[ 1,  2,  3],
       [ 8, 10, 12],
       [21, 24, 27]])
1
Ben 13 sierpień 2014, 16:22

Możesz użyć reshape:

y = y.reshape(-1,1)
1
Daniel 13 sierpień 2014, 16:21

Powód, dla którego nie możesz transponować y, ponieważ jest zainicjowany jako tablica 1-D. Transponowanie tablicy ma sens tylko w dwóch (lub więcej) wymiarach.

Aby ominąć te problemy z wymiarami mieszanymi, numpy faktycznie zapewnia zestaw funkcji wygody, aby odkażyć swoje wejścia:

y = np.array([1, 2, 3])
y1 = np.atleast_1d(y)  # Converts array to 1-D if less than that
y2 = np.atleast_2d(y)  # Converts array to 2-D if less than that
y3 = np.atleast_3d(y)  # Converts array to 3-D if less than that

Myśliłem też np.column_stack Falls w tej kategorii wygody, ponieważ umieszcza 1-D i 2-D macierzy jako kolumny, jakbyśmy się spodziewać, zamiast wymyślić odpowiednią serię przekonania i stosów.

y1 = np.array([1, 2, 3])
y2 = np.array([2, 4, 6])
y3 = np.array([[2, 6], [2, 4], [7, 7]])
y = np.column_stack((y1, y2, y3))

Myślę, że te funkcje nie są tak dobrze znane, jak powinny być i uważam je znacznie łatwiejsze, bardziej elastyczne i bezpieczniejsze niż ręcznie bawiące się z wymianami zmiennymi lub wymiarami. Unikają także tworzenia kopii, jeśli to możliwe, co może być małym środkiem specyfiki.


Aby odpowiedzieć na twoje pytanie, należy użyć np.atleast_2d, aby przekonwertować tablicę do tablicy 2-D, a następnie transponować go.

y = np.atleast_2d(y).T    

Inny sposób, aby szybko to zrobić, nie martwiąc się o y ma transpozycję x, a następnie transponować wynik z powrotem.

z = (x.T * y).T

Choć może to zabiegać o intencji kodu. Prawdopodobnie jest szybszy, jeśli wydajność jest ważna.


Jeśli wydajność jest ważna, może informować, która metoda chcesz użyć. Niektóre czasy na moim komputerze:

%timeit x * np.atleast_2d(y).T
100000 loops, best of 3: 7.98 us per loop

%timeit (x.T*y).T
100000 loops, best of 3: 3.27 us per loop

%timeit x * np.transpose([y])
10000 loops, best of 3: 20.2 us per loop

%timeit x * y.reshape(-1, 1)
100000 loops, best of 3: 3.66 us per loop
1
Roger Fan 13 sierpień 2014, 16:48

Zmienna Y ma kształt (3). Jeśli skonstruujesz to w ten sposób:

Y = numpy.ARray ([1, 2, 3], ndmin = 2)

... będzie miał kształt (1,3), który możesz transponować, aby uzyskać żądany wynik:

Y = numpy.ARray ([1, 2, 3], ndmin = 2) .t z = numpy.multiply (x, y)

0
Lukeclh 13 sierpień 2014, 16:28