如何向numpy数组添加行?
我有一个数组A
A = array([[0, 1, 2], [0, 2, 0]])
如果X中每一行的第一个元素满足特定条件,我希望从另一个数组X向该数组添加行。
Numpy数组不像列表那样有一个方法“append”,或者看起来是这样。
如果A和X是列表,我只会做:
for i in X:
if i[0] < 3:
A.append(i)
有没有一种numpythonic方法来做同样的事情?
谢谢, 年代;-)
如何向numpy数组添加行?
我有一个数组A
A = array([[0, 1, 2], [0, 2, 0]])
如果X中每一行的第一个元素满足特定条件,我希望从另一个数组X向该数组添加行。
Numpy数组不像列表那样有一个方法“append”,或者看起来是这样。
如果A和X是列表,我只会做:
for i in X:
if i[0] < 3:
A.append(i)
有没有一种numpythonic方法来做同样的事情?
谢谢, 年代;-)
当前回答
你还可以这样做:
newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
其他回答
您可以使用numpy.append()将一行附加到numpty数组中,并稍后将其重塑为矩阵。
import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
A = np.append(A, row)
如果可以在一个操作中完成构造,那么vstack-with-fancy-indexing之类的方法是一种很好的方法。但是如果你的情况更复杂,或者你的行是动态的,你可能想要增加数组。实际上,动态增长一个数组的numpythonic方法是动态增长一个列表:
A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
newrow = np.arange(3)+i
if i%5:
Alist.append(newrow)
A = np.array(Alist)
del Alist
列表针对这种访问模式进行了高度优化;在列表形式下没有方便的numpy多维索引,但只要追加,就很难比行数组列表做得更好。
如果每一行之后都不需要计算,那么在python中添加行,然后转换为numpy会快得多。下面是使用python 3.6和numpy 1.14进行的计时测试,每次增加一行,添加100行:
import numpy as np
from time import perf_counter, sleep
def time_it():
# Compare performance of two methods for adding rows to numpy array
py_array = [[0, 1, 2], [0, 2, 0]]
py_row = [4, 5, 6]
numpy_array = np.array(py_array)
numpy_row = np.array([4,5,6])
n_loops = 100
start_clock = perf_counter()
for count in range(0, n_loops):
numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
duration = perf_counter() - start_clock
print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
start_clock = perf_counter()
for count in range(0, n_loops):
py_array.append(py_row) # .15 micros
numpy_array = np.array(py_array) # 43.9 micros
duration = perf_counter() - start_clock
print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
sleep(15)
#time_it() prints:
numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row
So, the simple solution to the original question, from seven years ago, is to use vstack() to add a new row after converting the row to a numpy array. But a more realistic solution should consider vstack's poor performance under those circumstances. If you don't need to run data analysis on the array after every addition, it is better to buffer the new rows to a python list of rows (a list of lists, really), and add them as a group to the numpy array using vstack() before doing any data analysis.
你还可以这样做:
newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])
array_ = np.concatenate((array_, add_row), axis=0)