【问题标题】:About numpy's concatenate, hstack, vstack functions?关于numpy的concatenate、hstack、vstack函数?
【发布时间】:2017-03-25 16:10:36
【问题描述】:

看一些例子

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.concatenate((a,b), axis=0)) # [1,2,3,4,5,6]
print(np.hstack((a,b))) # [1,2,3,4,5,6]

print(np.vstack((a,b))) # [[1,2,3],[4,5,6]]
print(np.concatenate((a,b), axis=1)) # IndexError: axis 1 out of bounds [0, 1)

hstack的结果和concatenate along axis=0一样,但是api文档说hstack=concatenate along axis=1,请看https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.hstack.html#numpy.hstack

并且沿着axis=1连接会引发IndexError,api文档说hstack=concatenate along axis=0,请看https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.vstack.html#numpy.vstack

谁能解释一下?顺便问一下,谁能解释一下当ndarray的维度小于2并沿axis=1连接时如何广播?

【问题讨论】:

标签: python numpy


【解决方案1】:

查看hstack的实际代码:

arrs = [atleast_1d(_m) for _m in tup]
# As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
if arrs[0].ndim == 1:
    return _nx.concatenate(arrs, 0)
else:
    return _nx.concatenate(arrs, 1)

我在文档中没有看到任何关于 axis=1 的内容。它使用的术语是'stack them horizontally'

正如我在一年前提到的,Concatenation of 2 1D numpy arrays along 2nd axis,如果轴太高,早期版本不会引发错误。但是在 1.12 中我们得到了一个错误。

有一个新的np.stack 可以在需要的地方添加维度:

In [46]: np.stack((np.arange(3), np.arange(4,7)),axis=1)
Out[46]: 
array([[0, 4],
       [1, 5],
       [2, 6]])

基本函数是concatenate。各种stack 函数以一种或其他方式调整数组尺寸,然后执行concatenate。查看他们的代码以查看详细信息。 (我也总结了之前帖子中的差异)。

【讨论】:

  • 文档的“注释”部分指出 hstack 是“等效于 np.concatenate(tup, axis=1)”。
  • 错过了。但是像这样的简短笔记应该用大“盐”来做。
  • 看了源码,明白了,谢谢。可能是对api文档的疏忽。
【解决方案2】:

np.hstack(tup)np.concatenate(tup, axis=1) 确实是等价的,但前提是 tup 包含至少是二维的数组。这实际上是在vstack 的文档中阐明的,所以看起来这只是一个疏忽,它也没有在hstack 的文档中;不过会for future versions

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2023-02-20
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多