繁体   English   中英

将numpy数组中的元素舍入为另一个数组中相同索引的数量

[英]Rounding elements in numpy array to the number of the same index in another array

例如:

a=[[  2.22323422   3.34342   ]
  [ 24.324       97.56464   ]]

round_to= [[2 1]
          [1 3]]

我的预期输出是:

a_rounded= [[  2.2   3. ]
           [  2.   97.6]]

我想这样做而不会切掉每个元素并单独进行。

三种选择:

  1. 使用NumPy的.item类似于列表理解的.item
  2. itertools.starmap
  3. np.broadcast

时间如下。 选项3似乎是迄今为止最快的路线。

from itertools import starmap

np.random.seed(123)
target = np.random.randn(2, 2)
roundto = np.arange(1, 5, dtype=np.int16).reshape((2, 2)) # must be type int

def method1():
    return (np.array([round(target.item(i), roundto.item(j)) 
                    for i, j in zip(range(target.size), 
                                    range(roundto.size))])
                                    .reshape(target.shape))

def method2():
    return np.array(list(starmap(round, zip(target.flatten(), 
                                 roundto.flatten())))).reshape(target.shape)

def method3():
    b = np.broadcast(target, roundto)
    out = np.empty(b.shape)
    out.flat = [round(u,v) for (u,v) in b]
    return out

from timeit import timeit

timeit(method1, number=100)
Out[50]: 0.003252145578553467

timeit(method2, number=100)
Out[51]: 0.002063405777064986

timeit(method3, number=100)
Out[52]: 0.0009481473990007316

print('method 3 is %0.2f x faster than method 2' % 
      (timeit(method2, number=100) / timeit(method3, number=100)))
method 3 is 2.91 x faster than method 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM