我是靠谱客的博主 高挑蚂蚁,最近开发中收集的这篇文章主要介绍ndarray python 映射_python-在p中映射NumPy数组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是分散在答案和   我接受问题答案后写的评论。   总是欢迎提出支持,但是如果您支持此答案,请   也不要错过对senderle和(如果他写道)   一种)eryksun,他建议了以下方法。

问:是否可以将numpy数组映射到位?

答:可以,但不能使用单个数组方法。 您必须编写自己的代码。

下面的脚本比较了线程中讨论的各种实现:

import timeit

from numpy import array, arange, vectorize, rint

# SETUP

get_array = lambda side : arange(side**2).reshape(side, side) * 30

dim = lambda x : int(round(x * 0.67328))

# TIMER

def best(fname, reps, side):

global a

a = get_array(side)

t = timeit.Timer('%s(a)' % fname,

setup='from __main__ import %s, a' % fname)

return min(t.repeat(reps, 3)) #low num as in place --> converge to 1

# FUNCTIONS

def mac(array_):

for row in range(len(array_)):

for col in range(len(array_[0])):

array_[row][col] = dim(array_[row][col])

def mac_two(array_):

li = range(len(array_[0]))

for row in range(len(array_)):

for col in li:

array_[row][col] = int(round(array_[row][col] * 0.67328))

def mac_three(array_):

for i, row in enumerate(array_):

array_[i][:] = [int(round(v * 0.67328)) for v in row]

def senderle(array_):

array_ = array_.reshape(-1)

for i, v in enumerate(array_):

array_[i] = dim(v)

def eryksun(array_):

array_[:] = vectorize(dim)(array_)

def ufunc_ed(array_):

multiplied = array_ * 0.67328

array_[:] = rint(multiplied)

# MAIN

r = []

for fname in ('mac', 'mac_two', 'mac_three', 'senderle', 'eryksun', 'ufunc_ed'):

print('nTesting `%s`...' % fname)

r.append(best(fname, reps=50, side=50))

# The following is for visually checking the functions returns same results

tmp = get_array(3)

eval('%s(tmp)' % fname)

print tmp

tmp = min(r)/100

print('n===== ...AND THE WINNER IS... =========================')

print(' mac (as in question) : %.4fms [%.0f%%]') % (r[0]*1000,r[0]/tmp)

print(' mac (optimised) : %.4fms [%.0f%%]') % (r[1]*1000,r[1]/tmp)

print(' mac (slice-assignment) : %.4fms [%.0f%%]') % (r[2]*1000,r[2]/tmp)

print(' senderle : %.4fms [%.0f%%]') % (r[3]*1000,r[3]/tmp)

print(' eryksun : %.4fms [%.0f%%]') % (r[4]*1000,r[4]/tmp)

print(' slice-assignment w/ ufunc : %.4fms [%.0f%%]') % (r[5]*1000,r[5]/tmp)

print('=======================================================n')

至少在我的系统中,以上脚本的输出为:

mac (as in question) : 88.7411ms [74591%]

mac (optimised) : 86.4639ms [72677%]

mac (slice-assignment) : 79.8671ms [67132%]

senderle : 85.4590ms [71832%]

eryksun : 13.8662ms [11655%]

slice-assignment w/ ufunc : 0.1190ms [100%]

如您所见,使用numpy的ufunc可以将速度分别提高2到3个数量级,而分别排名第二和第二的是最差的。

如果不是使用ufunc,则这里仅是其他替代方案的比较:

mac (as in question) : 91.5761ms [672%]

mac (optimised) : 88.9449ms [653%]

mac (slice-assignment) : 80.1032ms [588%]

senderle : 86.3919ms [634%]

eryksun : 13.6259ms [100%]

HTH!

最后

以上就是高挑蚂蚁为你收集整理的ndarray python 映射_python-在p中映射NumPy数组的全部内容,希望文章能够帮你解决ndarray python 映射_python-在p中映射NumPy数组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部