本文将介绍重复NumPy数组而不复制数据?的详细情况,特别是关于重复numpy数组而不复制数据怎么办的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于
本文将介绍重复NumPy数组而不复制数据?的详细情况,特别是关于重复numpy数组而不复制数据怎么办的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于numpy切片数组而不复制它、python numpy数组的numpy数组、从numpy数组列表创建numpy数组的Python方法、从给定的numpy数组创建块对角线numpy数组的知识。
本文目录一览:- 重复NumPy数组而不复制数据?(重复numpy数组而不复制数据怎么办)
- numpy切片数组而不复制它
- python numpy数组的numpy数组
- 从numpy数组列表创建numpy数组的Python方法
- 从给定的numpy数组创建块对角线numpy数组
重复NumPy数组而不复制数据?(重复numpy数组而不复制数据怎么办)
我想创建一个1D NumPy数组,该数组由另一个1D数组的1000个背对背重复组成,而无需将数据复制1000次。
可能吗?
如果有帮助,我打算将两个数组都视为不可变的。
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)}
它具有数组shape
,strides
(这里是默认值)和指向数据缓冲区的指针。Aview
可以指向相同的数据缓冲区(可能更远),并具有自己的shape
和strides
。
但是用布尔值建立索引不能用这几个数字来概括。它要么必须一直携带整个index
阵列,要么从x
数据缓冲区中复制选定的项目。numpy
选择复制。您可以选择何时应用index
,立即应用还是在调用堆栈的更下游应用。
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数组的列表,然后将其转换为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数组,具有相等数量的列和行。我想将它们排列成一个较大的数组,对角线上的数组较小。应该可以指定起始矩阵在对角线上的频率。例如:
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数组的相关知识,请在本站进行查询。
本文标签: