在numpy数组中重复最后一列

时间:2018-02-15 10:15:43

标签: python numpy optimization

问题

我尝试重复数组中的最后一列(numpy)。我想知道是否有更多的优雅"比调整数组大小,复制值并重复最后一行x次。

我想要实现的目标

Input Array:                        Output Array:
[[1,2,3],                           [[1,2,3,3,3],
 [0,0,0],    -> repeat(2-times) ->   [0,0,0,0,0],
 [0,2,1]]                            [0,2,1,1,1]]

我是如何解决问题的

x = np.array([[1,2,3],[0,0,0],[0,2,1]])
# to repeat last row two times two times
new_size = x.shape[1] + 2
new_x = np.zeros((3,new_size))
new_x[:,:3] = x

for i in range(x.shape[1],new_size):
    new_x[:,i] = x[:,-1]

其他方式

有没有办法用numpy repeat函数解决这个问题? 或者更短或更高效的东西?

3 个答案:

答案 0 :(得分:4)

一种可能的解决方案:

a = np.hstack((arr, np.tile(arr[:, [-1]], 2)))
print (a)
[[1 2 3 3 3]
 [0 0 0 0 0]
 [0 2 1 1 1]]

答案 1 :(得分:1)

使用numpy.repeat()

np.repeat(a, [1]*(a.shape[1]-1) +[3], axis=1)

答案 2 :(得分:1)

广播通常很有效。

import numpy as np

A = np.random.randint(0, 100, (1000, 1000))

np.hstack((A, np.broadcast_to(A[:, -1][:, None], (A.shape[1], n))))

如果性能问题,则进行一些基准测试:

n = 1000
%timeit np.hstack((A, np.broadcast_to(A[:, -1][:, None], (A.shape[1], n))))  # 3.06 ms
%timeit np.hstack((A, np.tile(A[:, [-1]], n)))                               # 9.33 ms
%timeit np.repeat(A, [1]*(A.shape[1]-1) +[n], axis=1)                        # 12.9 ms