首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何平方或升幂(元素)的二维numpy数组?

如何平方或升幂(元素)的二维numpy数组?
EN

Stack Overflow用户
提问于 2014-09-16 22:03:17
回答 2查看 162.2K关注 0票数 47

我需要对2Dnumpy数组进行平方(元素级),并且我已经尝试了以下代码:

代码语言:javascript
复制
import numpy as np
a = np.arange(4).reshape(2, 2)
print a^2, '\n'
print a*a

这就产生了:

代码语言:javascript
复制
[[2 3]
[0 1]]

[[0 1]
[4 9]]

显然,不是a^2,而是a*a给出了我想要的结果。

我想知道是否存在另一种表示法来将numpy数组提升到2或N的幂?而不是a*a*a*..*a

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-17 04:35:02

最快的方法是使用a*aa**2np.square(a),而np.power(a, 2)则要慢得多。

如果您传递的不是2,而是另一个指数数组,那么np.power()允许您为每个元素使用不同的指数。从@GarethRees的评论中,我了解到这个函数将给你不同于a**2a*a的结果,这在你的容差很小的情况下变得很重要。

我使用NumPy 1.9.0MKL 64位对一些示例进行了计时,结果如下所示:

代码语言:javascript
复制
In [29]: a = np.random.random((1000, 1000))

In [30]: timeit a*a
100 loops, best of 3: 2.78 ms per loop

In [31]: timeit a**2
100 loops, best of 3: 2.77 ms per loop

In [32]: timeit np.power(a, 2)
10 loops, best of 3: 71.3 ms per loop
票数 71
EN

Stack Overflow用户

发布于 2014-09-17 05:04:18

代码语言:javascript
复制
>>> import numpy
>>> print numpy.power.__doc__

power(x1, x2[, out])

First array elements raised to powers from second array, element-wise.

Raise each base in `x1` to the positionally-corresponding power in
`x2`.  `x1` and `x2` must be broadcastable to the same shape.

Parameters
----------
x1 : array_like
    The bases.
x2 : array_like
    The exponents.

Returns
-------
y : ndarray
    The bases in `x1` raised to the exponents in `x2`.

Examples
--------
Cube each element in a list.

>>> x1 = range(6)
>>> x1
[0, 1, 2, 3, 4, 5]
>>> np.power(x1, 3)
array([  0,   1,   8,  27,  64, 125])

Raise the bases to different exponents.

>>> x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0]
>>> np.power(x1, x2)
array([  0.,   1.,   8.,  27.,  16.,   5.])

The effect of broadcasting.

>>> x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]])
>>> x2
array([[1, 2, 3, 3, 2, 1],
       [1, 2, 3, 3, 2, 1]])
>>> np.power(x1, x2)
array([[ 0,  1,  8, 27, 16,  5],
       [ 0,  1,  8, 27, 16,  5]])
>>>

精度

根据@GarethRees在评论中的反对意见,关于数值精度的讨论:

代码语言:javascript
复制
>>> a = numpy.ones( (3,3), dtype = numpy.float96 ) # yields exact output
>>> a[0,0] = 0.46002700024131926
>>> a
array([[ 0.460027,  1.0,  1.0],
       [ 1.0,  1.0,  1.0],
       [ 1.0,  1.0,  1.0]], dtype=float96)
>>> b = numpy.power( a, 2 )
>>> b
array([[ 0.21162484,  1.0,  1.0],
       [ 1.0,  1.0,  1.0],
       [ 1.0,  1.0,  1.0]], dtype=float96)

>>> a.dtype
dtype('float96')
>>> a[0,0]
0.46002700024131926
>>> b[0,0]
0.21162484095102677

>>> print b[0,0]
0.211624840951
>>> print a[0,0]
0.460027000241

性能

代码语言:javascript
复制
>>> c    = numpy.random.random( ( 1000, 1000 ) ).astype( numpy.float96 )

>>> import zmq
>>> aClk = zmq.Stopwatch()

>>> aClk.start(), c**2, aClk.stop()
(None, array([[ ...]], dtype=float96), 5663L)                #   5 663 [usec]

>>> aClk.start(), c*c, aClk.stop()
(None, array([[ ...]], dtype=float96), 6395L)                #   6 395 [usec]

>>> aClk.start(), c[:,:]*c[:,:], aClk.stop()
(None, array([[ ...]], dtype=float96), 6930L)                #   6 930 [usec]

>>> aClk.start(), c[:,:]**2, aClk.stop()
(None, array([[ ...]], dtype=float96), 6285L)                #   6 285 [usec]

>>> aClk.start(), numpy.power( c, 2 ), aClk.stop()
(None, array([[ ... ]], dtype=float96), 384515L)             # 384 515 [usec]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25870923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档