簡體   English   中英

Python numpy:向量(n-dim)與數組(nxn-dim)的維度[0]

[英]Python numpy: Dimension [0] in vectors (n-dim) vs. arrays (nxn-dim)

我目前想知道numpy數組的行為。 我覺得從向量( Nx1維)到“實際數組”( NxN維)的尺寸不一致。

我不明白,為什么這行不通:

a = array(([1,2],[3,4],[5,6]))
concatenate((a[:,0],a[:,1:]), axis = 1)
# ValueError: all the input arrays must have same number of dimensions

似乎: :(at 1:] )有所不同,但是( :0不起作用)

提前致謝!

詳細版本:因此,我希望shape(b)[0]在( Nx1數組)中引用垂直方向,就像在2D( NxN )數組中一樣。 但是,似乎[0]維是數組( Nx1數組)中的水平方向嗎?

from numpy import *

a = array(([1,2],[3,4],[5,6]))
b = a[:,0]
print shape(a)  # (3L, 2L), [0] is vertical
print a         # [1,2],[3,4],[5,6]
print shape(b)  # (3L, ), [0] is horizontal
print b         # [1 3 5]

c = b * ones((shape(b)[0],1)) 
print shape(c)  # (3L, 3L), I'd expect (3L, 1L)
print c         # [[ 1.  3.  5.], [ 1.  3.  5.], [ 1.  3.  5.]]

我怎么了? 有沒有比這更好的方法

d = b * ones((1, shape(b)[0]))
d = transpose(d)
print shape(d)  # (3L, 1L)
print d         # [[ 1.], [ 3.], [ 5.]]

得到我期望或想要的( Nx1 )向量?

這里有兩個總體問題。 首先, b 不是 (N, 1)形陣列,它是(N,)形陣列。 在numpy中,一維和二維數組是不同的東西。 一維陣列根本沒有方向。 垂直與水平,行與列,這是2D概念。

第二個與所謂的“ 廣播 ”有關。 在numpy數組中,您可以將低維數組廣播到高維數組,並且將低維部分逐元素應用於高維數組。

廣播規則非常簡單:

在兩個數組上進行操作時,NumPy逐元素比較其形狀。 它從尾隨尺寸開始,一直向前發展。 兩種尺寸兼容

它們相等,或者

其中之一是1

在您的情況下,它以ones((shape(b)[0],1))的最后一個尺寸開始,即1 這符合第二個條件。 因此,它將一個元素ones((shape(b)[0],1))每個元素逐元素地乘以數組b ,從而得到3D數組。

因此大致相當於:

c = np.array([x*b for x in ones(shape(b))])

編輯:

要回答您的原始問題,您要做的是將第一個和第二個數組都保留為2D數組。

numpy為此有一個非常簡單的規則:索引減少了維數,切片卻沒有。 因此,您需要做的是長度為1的切片。 因此,在您的示例中,只需將a[:,0]更改為a[:,:1] 這意味着“將每一列上移至第二列”。 當然,它僅包括第一列,但仍被視為切片操作,而不是獲取元素,因此它仍保留維數:

>>> print(a[:, 0])
[1 3 5]
>>> print(a[:, 0].shape)
(3,)
>>> print(a[:, :1])
[[1]
 [3]
 [5]]
>>> print(a[:, :1].shape)
(3, 1)
>>> print(concatenate((a[:,:1],a[:,1:]), axis = 1))
[[1 2]
 [3 4]
 [5 6]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM