Объединение массивов NumPy
У меня два 20x100x3 включает в себя массивы, которые я хочу объединить в массив 40 x 100 x 3, то есть просто добавьте больше строк в массив. Я смущен тем, какую функцию я хочу: это vstack, hstack, column_stack или, может быть, что-то еще?
5 ответов
один из лучших способов обучения-это эксперименты, но я бы сказал, что вы хотите np.vstack
хотя есть и другие способы сделать то же самое:
a = np.ones((20,100,3))
b = np.vstack((a,a))
print b.shape # (40,100,3)
или
b = np.concatenate((a,a),axis=0)
редактировать
так же, как Примечание, На моей машине для массивов размера в вопросе OP, я нахожу, что np.concatenate
- примерно в 2 раза быстрее, чем np.vstack
In [172]: a = np.random.normal(size=(20,100,3))
In [173]: c = np.random.normal(size=(20,100,3))
In [174]: %timeit b = np.concatenate((a,c),axis=0)
100000 loops, best of 3: 13.3 us per loop
In [175]: %timeit b = np.vstack((a,c))
10000 loops, best of 3: 26.1 us per loop
возможно, стоит упомянуть, что
np.concatenate((a1, a2, ...), axis=0)
- это общая форма, а vstack и hstack-конкретные случаи. Мне проще всего просто знать, какое измерение я хочу сложить и предоставить это в качестве аргумента np.связывать.
я попробовал небольшой тест между r_ и vstack, и результат очень интересный:
import numpy as np
NCOLS = 10
NROWS = 2
NMATRICES = 10000
def mergeR(matrices):
result = np.zeros([0, NCOLS])
for m in matrices:
result = np.r_[ result, m]
def mergeVstack(matrices):
result = np.vstack(matrices)
def main():
matrices = tuple( np.random.random([NROWS, NCOLS]) for i in xrange(NMATRICES) )
mergeR(matrices)
mergeVstack(matrices)
return 0
if __name__ == '__main__':
main()
затем я запустил профайлер:
python -m cProfile -s cumulative np_merge_benchmark.py
результаты:
ncalls tottime percall cumtime percall filename:lineno(function)
...
1 0.579 0.579 4.139 4.139 np_merge_benchmark.py:21(mergeR)
...
1 0.000 0.000 0.054 0.054 np_merge_benchmark.py:27(mergeVstack)
Так путь vstack 77x быстрее!
кстати, есть еще r_
:
>>> from scipy import *
>>> a = rand(20,100,3)
>>> b = rand(20,100,3)
>>> a.shape
(20, 100, 3)
>>> b.shape
(20, 100, 3)
>>> r_[a,b].shape
(40, 100, 3)
>>> (r_[a,b] == vstack([a,b])).all()
True