GVKun编程网logo

重复NumPy数组而不复制数据?(重复numpy数组而不复制数据怎么办)

23

本文将介绍重复NumPy数组而不复制数据?的详细情况,特别是关于重复numpy数组而不复制数据怎么办的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于

本文将介绍重复NumPy数组而不复制数据?的详细情况,特别是关于重复numpy数组而不复制数据怎么办的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于numpy切片数组而不复制它、python numpy数组的numpy数组、从numpy数组列表创建numpy数组的Python方法、从给定的numpy数组创建块对角线numpy数组的知识。

本文目录一览:

重复NumPy数组而不复制数据?(重复numpy数组而不复制数据怎么办)

重复NumPy数组而不复制数据?(重复numpy数组而不复制数据怎么办)

我想创建一个1D NumPy数组,该数组由另一个1D数组的1000个背对背重复组成,而无需将数据复制1000次。

可能吗?

如果有帮助,我打算将两个数组都视为不可变的。

numpy切片数组而不复制它

numpy切片数组而不复制它

我的矩阵中有大量数据x,我需要分析一些子矩阵。

我正在使用以下代码来选择子矩阵:

>>> import numpy as np>>> x = np.random.normal(0,1,(20,2))>>> xarray([[-1.03266826,  0.04646684],       [ 0.05898304,  0.31834926],       [-0.1916809 , -0.97929025],       [-0.48837085, -0.62295003],       [-0.50731017,  0.50305894],       [ 0.06457385, -0.10670002],       [-0.72573604,  1.10026385],       [-0.90893845,  0.99827162],       [ 0.20714399, -0.56965615],       [ 0.8041371 ,  0.21910274],       [-0.65882317,  0.2657183 ],       [-1.1214074 , -0.39886425],       [ 0.0784783 , -0.21630006],       [-0.91802557, -0.20178683],       [ 0.88268539, -0.66470235],       [-0.03652459,  1.49798484],       [ 1.76329838, -0.26554555],       [-0.97546845, -2.41823586],       [ 0.32335103, -1.35091711],       [-0.12981597,  0.27591674]])>>> index = x[:,1] > 0>>> indexarray([ True,  True, False, False,  True, False,  True,  True, False,        True,  True, False, False, False, False,  True, False, False,       False,  True], dtype=bool)>>> x1 = x[index, :] #x1 is a copy of the submatrix>>> x1array([[-1.03266826,  0.04646684],       [ 0.05898304,  0.31834926],       [-0.50731017,  0.50305894],       [-0.72573604,  1.10026385],       [-0.90893845,  0.99827162],       [ 0.8041371 ,  0.21910274],       [-0.65882317,  0.2657183 ],       [-0.03652459,  1.49798484],       [-0.12981597,  0.27591674]])>>> x1[0,0] = 1000>>> x1array([[  1.00000000e+03,   4.64668400e-02],       [  5.89830401e-02,   3.18349259e-01],       [ -5.07310170e-01,   5.03058935e-01],       [ -7.25736045e-01,   1.10026385e+00],       [ -9.08938455e-01,   9.98271624e-01],       [  8.04137104e-01,   2.19102741e-01],       [ -6.58823174e-01,   2.65718300e-01],       [ -3.65245877e-02,   1.49798484e+00],       [ -1.29815968e-01,   2.75916735e-01]])>>> xarray([[-1.03266826,  0.04646684],       [ 0.05898304,  0.31834926],       [-0.1916809 , -0.97929025],       [-0.48837085, -0.62295003],       [-0.50731017,  0.50305894],       [ 0.06457385, -0.10670002],       [-0.72573604,  1.10026385],       [-0.90893845,  0.99827162],       [ 0.20714399, -0.56965615],       [ 0.8041371 ,  0.21910274],       [-0.65882317,  0.2657183 ],       [-1.1214074 , -0.39886425],       [ 0.0784783 , -0.21630006],       [-0.91802557, -0.20178683],       [ 0.88268539, -0.66470235],       [-0.03652459,  1.49798484],       [ 1.76329838, -0.26554555],       [-0.97546845, -2.41823586],       [ 0.32335103, -1.35091711],       [-0.12981597,  0.27591674]])>>>

但我希望x1只是一个指针或类似的东西。每当需要子矩阵时,复制数据对我来说都是太昂贵了。我怎样才能做到这一点?

编辑:显然没有与numpy数组的任何解决方案。从这个角度来看,熊猫数据框会更好吗?

答案1

小编典典

属性中x汇总了有关阵列的信息.__array_interface__

In [433]: x.__array_interface__Out[433]: {''descr'': [('''', ''<f8'')], ''strides'': None, ''data'': (171396104, False), ''typestr'': ''<f8'', ''version'': 3, ''shape'': (20, 2)}

它具有数组shapestrides(这里是默认值)和指向数据缓冲区的指针。Aview可以指向相同的数据缓冲区(可能更远),并具有自己的shapestrides

但是用布尔值建立索引不能用这几个数字来概括。它要么必须一直携带整个index阵列,要么从x数据缓冲区中复制选定的项目。
numpy选择复制。您可以选择何时应用index,立即应用还是在调用堆栈的更下游应用。

python numpy数组的numpy数组

python numpy数组的numpy数组

我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它:

a=np.array([])
while(...):
   ...
   b= //a numpy array generated
   a=np.append(a,b)
   ...

所需结果:

[[1,5,3],[9,10,1],...,[4,8,6]]

实际结果:

[1,3,9,1,... 4,6]

可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。

从numpy数组列表创建numpy数组的Python方法

从numpy数组列表创建numpy数组的Python方法

我在循环中生成一维numpy数组的列表,然后将其转换为2d
numpy数组。如果我提前知道项目数,我会预先分配一个2d的numpy数组,但是我不知道,因此我将所有内容都放在了列表中。

模拟如下:

>>> list_of_arrays = map(lambda x: x*ones(2), range(5))>>> list_of_arrays[array([ 0.,  0.]), array([ 1.,  1.]), array([ 2.,  2.]), array([ 3.,  3.]), array([ 4.,  4.])]>>> arr = array(list_of_arrays)>>> arrarray([[ 0.,  0.],       [ 1.,  1.],       [ 2.,  2.],       [ 3.,  3.],       [ 4.,  4.]])

我的问题如下:

是否有一种更好的方法(性能上)来执行收集顺序数值数据(在我的情况下为numpy数组)的任务,而不是将它们放入列表中,然后从中制成numpy.array(我正在创建新的obj并复制数据)?经过良好测试的模块中是否有可用的“可扩展”矩阵数据结构?

我的2d矩阵的典型大小在100x10到​​5000x10浮动之间

编辑: 在此示例中,我正在使用地图,但是在我的实际应用程序中,我有一个for循环

答案1

小编典典

假设您知道最终的数组arr永远不会大于5000x10。然后,您可以预分配最大大小的数组,在遍历循环时将其填充数据,然后arr.resize在退出循环后将其缩减为发现的大小。

下面的测试表明,无论数组的最终大小如何,这样做都会比构造中间python列表快一点。

同样,arr.resize取消分配未使用的内存,因此最终的(虽然可能不是中间的)内存占用空间小于所使用的内存占用空间python_lists_to_array

这表明numpy_all_the_way速度更快:

% python -mtimeit -s"import test" "test.numpy_all_the_way(100)"100 loops, best of 3: 1.78 msec per loop% python -mtimeit -s"import test" "test.numpy_all_the_way(1000)"100 loops, best of 3: 18.1 msec per loop% python -mtimeit -s"import test" "test.numpy_all_the_way(5000)"10 loops, best of 3: 90.4 msec per loop% python -mtimeit -s"import test" "test.python_lists_to_array(100)"1000 loops, best of 3: 1.97 msec per loop% python -mtimeit -s"import test" "test.python_lists_to_array(1000)"10 loops, best of 3: 20.3 msec per loop% python -mtimeit -s"import test" "test.python_lists_to_array(5000)"10 loops, best of 3: 101 msec per loop

这显示numpy_all_the_way使用更少的内存:

% test.pyInitial memory usage: 19788After python_lists_to_array: 20976After numpy_all_the_way: 20348

test.py:

import numpy as npimport osdef memory_usage():    pid = os.getpid()    return next(line for line in open(''/proc/%s/status'' % pid).read().splitlines()                if line.startswith(''VmSize'')).split()[-2]N, M = 5000, 10def python_lists_to_array(k):    list_of_arrays = list(map(lambda x: x * np.ones(M), range(k)))    arr = np.array(list_of_arrays)    return arrdef numpy_all_the_way(k):    arr = np.empty((N, M))    for x in range(k):        arr[x] = x * np.ones(M)    arr.resize((k, M))    return arrif __name__ == ''__main__'':    print(''Initial memory usage: %s'' % memory_usage())    arr = python_lists_to_array(5000)    print(''After python_lists_to_array: %s'' % memory_usage())    arr = numpy_all_the_way(5000)    print(''After numpy_all_the_way: %s'' % memory_usage())

从给定的numpy数组创建块对角线numpy数组

从给定的numpy数组创建块对角线numpy数组

我有一个二维的numpy数组,具有相等数量的列和行。我想将它们排列成一个较大的数组,对角线上的数组较小。应该可以指定起始矩阵在对角线上的频率。例如:

a = numpy.array([[5, 7],                  [6, 3]])

因此,如果我希望此数组在对角线上2次,则期望的输出将是:

array([[5, 7, 0, 0],        [6, 3, 0, 0],        [0, 0, 5, 7],        [0, 0, 6, 3]])

3次:

array([[5, 7, 0, 0, 0, 0],        [6, 3, 0, 0, 0, 0],        [0, 0, 5, 7, 0, 0],        [0, 0, 6, 3, 0, 0],       [0, 0, 0, 0, 5, 7],       [0, 0, 0, 0, 6, 3]])

有没有一种快速的方法来使用numpy方法以及对于任意大小的起始数组(仍然考虑到起始数组具有相同的行数和列数)来实现这一点?

答案1

小编典典

方法1

经典案例numpy.kron-

np.kron(np.eye(r,dtype=int),a) # r is number of repeats

样品运行-

In [184]: aOut[184]: array([[1, 2, 3],       [3, 4, 5]])In [185]: r = 3 # number of repeatsIn [186]: np.kron(np.eye(r,dtype=int),a)Out[186]: array([[1, 2, 3, 0, 0, 0, 0, 0, 0],       [3, 4, 5, 0, 0, 0, 0, 0, 0],       [0, 0, 0, 1, 2, 3, 0, 0, 0],       [0, 0, 0, 3, 4, 5, 0, 0, 0],       [0, 0, 0, 0, 0, 0, 1, 2, 3],       [0, 0, 0, 0, 0, 0, 3, 4, 5]])

方法#2

另一个高效的diagonal-viewed-array-assignment-

def repeat_along_diag(a, r):    m,n = a.shape    out = np.zeros((r,m,r,n), dtype=a.dtype)    diag = np.einsum(''ijik->ijk'',out)    diag[:] = a    return out.reshape(-1,n*r)

样品运行-

In [188]: repeat_along_diag(a,3)Out[188]: array([[1, 2, 3, 0, 0, 0, 0, 0, 0],       [3, 4, 5, 0, 0, 0, 0, 0, 0],       [0, 0, 0, 1, 2, 3, 0, 0, 0],       [0, 0, 0, 3, 4, 5, 0, 0, 0],       [0, 0, 0, 0, 0, 0, 1, 2, 3],       [0, 0, 0, 0, 0, 0, 3, 4, 5]])

今天的关于重复NumPy数组而不复制数据?重复numpy数组而不复制数据怎么办的分享已经结束,谢谢您的关注,如果想了解更多关于numpy切片数组而不复制它、python numpy数组的numpy数组、从numpy数组列表创建numpy数组的Python方法、从给定的numpy数组创建块对角线numpy数组的相关知识,请在本站进行查询。

本文标签: