numpy ravel 对不一致的维度对象
numpy ravel on inconsistent dimensional object
我有下面的代码,它允许我迭代一个展平的列表并将更新映射回结构化数组 -
a = np.asarray([1,2,3])
b = np.asarray([4,5,6])
c = np.asarray([a, b])
print c
r = c.ravel()
print r
r[1] = 10
print c
设置 r[1] = 10 将 c[0][1] 修改为 10。我想对下面的代码片段做一些类似的事情,但这失败了,我假设这是因为尺寸不一致。有没有什么方法可以获得类似的行为,这样我就可以修改扁平化版本而不必将其重新整形回 c?
a = np.asarray([1,2,3])
b = np.asarray([4,5,6,7,8])
c = np.asarray([a, b])
r = c.ravel()
r[1] = 10
print r
在你的第一种情况下 c
是一个二维数组
In [391]: a = np.asarray([1,2,3])
...: b = np.asarray([4,5,6])
...: c = np.asarray([a, b])
...:
In [392]: c
Out[392]:
array([[1, 2, 3],
[4, 5, 6]])
In [393]: c.shape
Out[393]: (2, 3)
ravel
生成 c
的视图,因此对一个视图的更改会出现在另一个视图中
In [394]: r = c.ravel()
In [395]: r[1] = 10
In [396]: c
Out[396]:
array([[ 1, 10, 3],
[ 4, 5, 6]])
也可以用flat
索引c
,效果一样:
In [397]: c.flat[4] = 10
In [398]: c
Out[398]:
array([[ 1, 10, 3],
[ 4, 10, 6]])
In [399]: r
Out[399]: array([ 1, 10, 3, 4, 10, 6])
对 c
或 r
的这些更改不会影响原始 a
或 b
。 asarray
复制那些数组。
在第二种情况下 c
是一个包含其他数组的一维数组:
In [400]: a = np.asarray([1,2,3])
...: b = np.asarray([4,5,6,7,8])
...: c = np.asarray([a, b])
...:
In [401]: c
Out[401]: array([array([1, 2, 3]), array([4, 5, 6, 7, 8])], dtype=object)
碎片可以连接成一维数组:
In [402]: np.concatenate(c)
Out[402]: array([1, 2, 3, 4, 5, 6, 7, 8])
可以更改值,但不会影响原始值 c
。
In [403]: c[0][0] = 10
In [404]: c
Out[404]: array([array([10, 2, 3]), array([4, 5, 6, 7, 8])], dtype=object)
这改变了原来的 a
因为 c
字面上包含 a
,而不是它的副本:
In [405]: a
Out[405]: array([10, 2, 3]
np.array
(或asarray
)尝试尽可能地从输入中生成一维数组。在第一种情况下,输入的大小相等,所以它是 2d。在第二个中,它们不同,因此它构成了一个一维对象数组。这种行为通常会给用户带来麻烦。他们要么在第二种情况下期望二维数组,要么在第一种情况下无法生成对象数组。
要可靠地创建对象数组,无论输入大小是否匹配,您都必须执行类似
的操作
In [417]: g = np.empty(2, dtype=object)
In [418]: g[:] = [a, b[:3]]
In [419]: g
Out[419]: array([array([10, 2, 3]), array([4, 5, 6])], dtype=object)
我有下面的代码,它允许我迭代一个展平的列表并将更新映射回结构化数组 -
a = np.asarray([1,2,3])
b = np.asarray([4,5,6])
c = np.asarray([a, b])
print c
r = c.ravel()
print r
r[1] = 10
print c
设置 r[1] = 10 将 c[0][1] 修改为 10。我想对下面的代码片段做一些类似的事情,但这失败了,我假设这是因为尺寸不一致。有没有什么方法可以获得类似的行为,这样我就可以修改扁平化版本而不必将其重新整形回 c?
a = np.asarray([1,2,3])
b = np.asarray([4,5,6,7,8])
c = np.asarray([a, b])
r = c.ravel()
r[1] = 10
print r
在你的第一种情况下 c
是一个二维数组
In [391]: a = np.asarray([1,2,3])
...: b = np.asarray([4,5,6])
...: c = np.asarray([a, b])
...:
In [392]: c
Out[392]:
array([[1, 2, 3],
[4, 5, 6]])
In [393]: c.shape
Out[393]: (2, 3)
ravel
生成 c
的视图,因此对一个视图的更改会出现在另一个视图中
In [394]: r = c.ravel()
In [395]: r[1] = 10
In [396]: c
Out[396]:
array([[ 1, 10, 3],
[ 4, 5, 6]])
也可以用flat
索引c
,效果一样:
In [397]: c.flat[4] = 10
In [398]: c
Out[398]:
array([[ 1, 10, 3],
[ 4, 10, 6]])
In [399]: r
Out[399]: array([ 1, 10, 3, 4, 10, 6])
对 c
或 r
的这些更改不会影响原始 a
或 b
。 asarray
复制那些数组。
在第二种情况下 c
是一个包含其他数组的一维数组:
In [400]: a = np.asarray([1,2,3])
...: b = np.asarray([4,5,6,7,8])
...: c = np.asarray([a, b])
...:
In [401]: c
Out[401]: array([array([1, 2, 3]), array([4, 5, 6, 7, 8])], dtype=object)
碎片可以连接成一维数组:
In [402]: np.concatenate(c)
Out[402]: array([1, 2, 3, 4, 5, 6, 7, 8])
可以更改值,但不会影响原始值 c
。
In [403]: c[0][0] = 10
In [404]: c
Out[404]: array([array([10, 2, 3]), array([4, 5, 6, 7, 8])], dtype=object)
这改变了原来的 a
因为 c
字面上包含 a
,而不是它的副本:
In [405]: a
Out[405]: array([10, 2, 3]
np.array
(或asarray
)尝试尽可能地从输入中生成一维数组。在第一种情况下,输入的大小相等,所以它是 2d。在第二个中,它们不同,因此它构成了一个一维对象数组。这种行为通常会给用户带来麻烦。他们要么在第二种情况下期望二维数组,要么在第一种情况下无法生成对象数组。
要可靠地创建对象数组,无论输入大小是否匹配,您都必须执行类似
的操作In [417]: g = np.empty(2, dtype=object)
In [418]: g[:] = [a, b[:3]]
In [419]: g
Out[419]: array([array([10, 2, 3]), array([4, 5, 6])], dtype=object)