Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用特定位置中的值初始化数组_Python_Arrays_Numpy_Initialization - Fatal编程技术网

Python 使用特定位置中的值初始化数组

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

我想初始化一个填充了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, 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编码表示

玩得开心
作为最后一点,检查是非常有趣的。您甚至可以尝试推断与密集版本相比,数据点变得有害的临界数量。

这非常完整,谢谢!