- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 numpy ndarray
大多数时候我们不需要担心内存布局的问题,因为结果并不依赖于它。
除非他们这样做。例如,考虑这种设置 3x2 矩阵对角线的稍微过度设计的方法
>>> a = np.zeros((3,2))
>>> a.reshape(2,3)[:,0] = 1
>>> a
array([[1., 0.],
[0., 1.],
[0., 0.]])
只要我们控制
a
的内存布局这可以。但是,如果我们不这样做,那就是一个错误,更糟糕的是,这是一个令人讨厌的无声错误:
>>> a = np.zeros((3,2),order='F')
>>> a.reshape(2,3)[:,0] = 1
>>> a
array([[0., 0.],
[0., 0.],
[0., 0.]])
这足以表明内存布局不仅仅是一个实现细节。
empty
,
ones
,
zeros
,
identity
等。默认返回 C 连续布局。
>>> a = np.arange(8).reshape(2,2,2).transpose(1,0,2)
>>> aa = a*a
产品
aa
是 ufunc 分配的新数组
np.multiply
.它是 C 连续的吗?不:
>>> aa.strides
(16, 32, 8)
我的猜测是,这是优化的结果,该优化认识到可以在平面线性阵列上完成此操作,这将解释为什么输出具有与输入相同的内存布局。
>>> def symmetrize_along_axis(a,axis=0):
... aux = a.swapaxes(0,axis)
... out = aux + aux[::-1]
... return out.swapaxes(0,axis)
稍微令人惊讶但显然是可取的事情是,只要输入是连续的,就会产生连续的输出。
>>> a = np.arange(8).reshape(2,2,2)
>>> symmetrize_along_axis(a,1).flags.contiguous
True
这足以表明了解 ufunc 返回的布局非常有用。因此我的问题是:
最佳答案
在 a = np.zeros((3,2),order='F')
案例,a.reshape(2,3)
创建一个副本,而不是一个 View 。这就是分配失败的原因,而不是内存布局本身。
查看相同形状的数组:
In [123]: a = np.arange(6).reshape(3,2)
In [124]: a
Out[124]:
array([[0, 1],
[2, 3],
[4, 5]])
In [125]: a.reshape(2,3)
Out[125]:
array([[0, 1, 2],
[3, 4, 5]])
In [127]: a.reshape(2,3)[:,0]
Out[127]: array([0, 3])
在 [125] 中,值仍然按顺序 C 流动。
In [128]: b = np.arange(6).reshape(3,2, order='F')
In [129]: b
Out[129]:
array([[0, 3], # values flow in order F
[1, 4],
[2, 5]])
In [130]: b.reshape(2,3)
Out[130]:
array([[0, 3, 1], # values are jumbled
[4, 2, 5]])
In [131]: b.reshape(2,3)[:,0]
Out[131]: array([0, 4])
如果我保持订单 F 的形状:
In [132]: b.reshape(2,3, order='F')
Out[132]:
array([[0, 2, 4], # values still flow in order F
[1, 3, 5]])
In [133]: b.reshape(2,3, order='F')[:,0]
Out[133]: array([0, 1])
确认分配:
In [135]: a.reshape(2,3)[:,0]=10
In [136]: a
Out[136]:
array([[10, 1],
[ 2, 10],
[ 4, 5]])
不赋值:
In [137]: b.reshape(2,3)[:,0]=10
In [138]: b
Out[138]:
array([[0, 3],
[1, 4],
[2, 5]])
但这里的分配工作:
In [139]: b.reshape(2,3, order='F')[:,0]=10
In [140]: b
Out[140]:
array([[10, 3],
[10, 4],
[ 2, 5]])
或者我们可以使用订单
A
保持秩序:
In [143]: b.reshape(2,3, order='A')[:,0]
Out[143]: array([10, 10])
In [144]: b.reshape(2,3, order='A')[:,0] = 20
In [145]: b
Out[145]:
array([[20, 3],
[20, 4],
[ 2, 5]])
ufunc 命令
ufunc
(大部分)是用
nditer
实现的(C 版),我检查了 np.nditer` 文档 - 可以在几个地方指定顺序。并且教程演示了顺序对迭代的影响。
order
记录于
ufunc
,但是,它被
kwargs
接受.
In [171]: c = np.arange(8).reshape(2,2,2)
In [172]: d = c.transpose(1,0,2)
In [173]: d.strides
Out[173]: (16, 32, 8)
In [174]: np.multiply(d,d,order='K').strides
Out[174]: (16, 32, 8)
In [175]: np.multiply(d,d,order='C').strides
Out[175]: (32, 16, 8)
In [176]: np.multiply(d,d,order='F').strides
Out[176]: (8, 16, 32)
关于python - 预测 ufunc 输出的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62988794/
有没有办法判断一个 ndarray 子类的 __array_wrap__是用一元函数还是二元函数调用的? (另一个 reference ) 最佳答案 这只是部分答案: ufunc 的参数作为元组传递给
算术 numpy 表达式的内存消耗是多少 vec ** 3 + vec ** 2 + vec (vec 是 numpy.ndarray)。是否为每个中间操作存储一个数组?这样的复合表达式是否可以比底层
假设我有以下 numpy 数组: >>> a=np.zeros(10) >>> a array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
使用 numpy ndarray大多数时候我们不需要担心内存布局的问题,因为结果并不依赖于它。 除非他们这样做。例如,考虑这种设置 3x2 矩阵对角线的稍微过度设计的方法 >>> a = np.zer
我当然可以 a[a == 0] = something 将 a 中每个等于 0 的条目设置为 something。同样,我可以写 a[np.equal(a, 0)] = something 现在,想象
我当然可以 a[a == 0] = something 将 a 中每个等于 0 的条目设置为 something。同样,我可以写 a[np.equal(a, 0)] = something 现在,想象
有没有办法使用 numpy ufunc.at(特别是 add.at)来连接字符串数组? add.at 或 char.add.at 都不能用于字符串/字符数组。 该方法需要处理n维数组,所以先根据索引拆
我正在尝试使用 MPI 将模块广播到其他 python 进程。当然,模块本身不可 pickle ,但 __dict__ 可以。目前,我正在 pickle __dict__ 并在接收过程中制作一个新模块
有没有一个ufunc只转发数据? 在大多数情况下实现相同的效果并不困难,但有时在显式使用 ufunc 时,使用仅转发数据的函数会很方便。主要用于测试/调试并具有一致的代码外观。 例如,当我有一个接受
在我跟踪粒子路径的程序中,出现以下错误: Traceback (most recent call last): File "C:\Users\Felix\Google Drive\Research
我正在慢慢学习一些机器学习,但在一次使用计算机视觉对 kaggle 猫狗数据集进行练习时,发生了一些我不太明白的事情。 然后当我尝试规范化 pickle 中的图像值时,它在编写时起作用 X = X/2
我使用 Anaconda 和 gdsCAD,当所有软件包都正确安装时出现错误。就像这里解释的那样:http://pythonhosted.org/gdsCAD/ TypeError: ufunc 'a
基本上我有一个在 npy_cdouble 上运行的 numpy ufunc和npy_cfloat数组。例如: static void ufunc_H( char ** args , np
我想知道 r = ufct.identity 在函数 ufunc_reduce 中做了什么。它是否只是像 r = 0 一样初始化操作? a = np.array([2,3,4,5]) b = np.a
这个问题有关于使用输入作为输出来使用 numpy.ufunc 计算某些东西的信息: Numpy passing input array as `out` argument to ufunc 是否可以避
假设我们有一个接受 Numpy 数组并返回另一个数组的 Python 函数: import numpy as np def f(x, y, method='p'): """Parameters
我看到 Universal Function(ufunc) 用于执行按元素的数组操作。 arr = np.arange(5) arr2 = np.arange(5,10) np.add(arr,
我觉得 numpy.power 没有轴参数很奇怪……是因为有更好/更安全的方法来实现相同的目标(将 3D 数组中的每个 2D 数组提升为 1D 数组的幂) . 假设您有一个 (3,10,10) 数组
我有一个 numpy 数组,我想找到它的最大元素,所以我调用: x = foo.max() 问题是 foo 有时是一个空数组,max 函数(可以理解)抛出: ValueError: zero-size
我很好奇使用 numpy 的好处和权衡 ufuncs vs. 内置运算符 vs. 内置运算符的“函数”版本。 我对所有 ufunc 都很好奇。也许有些时候有些比其他更有用。但是,我将使用 >> x =
我是一名优秀的程序员,十分优秀!