[英]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.