Python 使用特定位置中的值初始化数组
我想初始化一个填充了0的数组,并在特定位置初始化一个1。我知道如何使用以下两行代码:Python 使用特定位置中的值初始化数组,python,arrays,numpy,initialization,Python,Arrays,Numpy,Initialization,我想初始化一个填充了0的数组,并在特定位置初始化一个1。我知道如何使用以下两行代码: np_loc = [y * shape[1] + x for x, y in zip(loc_x, loc_y)] # not in the timeit np_arr2 = np.zeros(shape) np.put(np_arr2, np_loc, data) # timeit > 497 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 10
np_loc = [y * shape[1] + x for x, y in zip(loc_x, loc_y)] # not in the timeit
np_arr2 = np.zeros(shape)
np.put(np_arr2, np_loc, data)
# timeit > 497 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
((sp_arr.toarray() == np_arr) & (np_arr == np_arr2)).all()
# > True
将numpy导入为np
形状=(2,3)
位置=(0,1)
arr=np.零(形状)
arr[位置]=1
是否有一种更快的方法可以做到这一点,也许是使用一条直线?引入稀疏性
即使您可能找不到任何方法使这种简单的初始化更快,您也可能希望使用更大的矩阵和/或具有多个数据点的矩阵
存在几种类型的稀疏矩阵,它们的目的是使某些计算速度更快(但另一些计算速度较慢,特别是对于每种类型),并且只要矩阵由多个零组成,它们的内存使用效率就更高
但对于您的具体情况,速度会慢一些:
import numpy as np
from scipy import sparse
shape = (2, 3)
location = (0, 1)
# With dense matrix
arr = np.zeros(shape)
arr[location] = 1
# timeit > 280 ns ± 4.16 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
# With coordinate matrix
sparr = sparse.coo_matrix(([1], ([location[0]], [location[1]])), shape=shape)
# timeit > 20.5 µs ± 156 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
稀疏性:矩阵的一个典型例子
但是,假设您有一个非常大的矩阵,其中一些矩阵被分派到某些位置,您可以简单地执行以下操作:
shape = (2000, 3000)
n_points = 500
loc_y = np.random.randint(shape[0], size=(n_points))
loc_x = np.random.randint(shape[1], size=(n_points))
data = np.ones(np_points)
sp_arr = sparse.coo_matrix((data, (loc_y, loc_x)), shape=shape)
# timeit > 17.8 µs ± 90.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
与此相反:
np_arr = np.zeros(shape)
for d, x, y in zip(data, loc_x, loc_y):
np_arr[y, x] = d
# timeit > 613 µs ± 8.53 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
。。。或者像这样的事情:
np_loc = [y * shape[1] + x for x, y in zip(loc_x, loc_y)] # not in the timeit
np_arr2 = np.zeros(shape)
np.put(np_arr2, np_loc, data)
# timeit > 497 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
((sp_arr.toarray() == np_arr) & (np_arr == np_arr2)).all()
# > True
局限性
请注意,在许多情况下,您可能必须将稀疏矩阵转换为经典的numpy(稠密)数组,这需要计算时间。稀疏矩阵的使用可能是最佳的,在这种情况下,你必须做几次这样的操作,而不需要在步骤之间将它们转换成密集的数组;例如,处理具有许多特征的数据集的onehot编码表示
玩得开心
作为最后一点,检查是非常有趣的。您甚至可以尝试推断与密集版本相比,数据点变得有害的临界数量。这非常完整,谢谢!