1. 程式人生 > 實用技巧 >Numpy.frompyfunc()將計算單個值的函式轉化為計算陣列中每個元素的函式

Numpy.frompyfunc()將計算單個值的函式轉化為計算陣列中每個元素的函式

Numpy.frompyfunc()將計算單個值的函式轉化為計算陣列中每個元素的函式

不再通過遍歷,對陣列中的元素進行運算,利用frompyfunc()將計算單個值的函式轉化為計算陣列中每個元素的函式

下面是示例程式碼:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 20 17:18:11 2020

@author: pan
"""
import time
import numpy as np

arr = np.random.randint(30000, size=(1000, 600), dtype='int16')

def calc(arr):
    condlist = [arr<5000,5000<=arr<10000,15000<=arr<20000,20000<=arr<25000,arr>=25000]
    funclist = [lambda arr:arr*0.55,lambda arr:arr*0.81,lambda arr:arr*0.972,lambda arr:arr*1.067,lambda arr:arr*1.5]
    out = np.piecewise(arr, condlist, funclist)
    return out

# 迴圈方法
result = np.zeros((1000,600))
t1 = time.time()
for i in range(1000):
    for j in range(600):
        tep = calc(arr[i][j])
        result[i][j] = tep
print('LOOP Time used: {} sec'.format(time.time()-t1))

# 使用frompyfunc()將計算單個值的函式轉化為計算陣列中每個元素的函式
# frompyfunc(func, nin, nout)
# func  是要進行轉化的函式  nin是輸入引數的個數  nout是返回值的個數
calc_ufunc = np.frompyfunc(calc, 1, 1)
t2 = time.time()
img1 = calc_ufunc(arr).astype(np.float)
print('frompyfunc Time used: {} sec'.format(time.time()-t2))

print('calc data has done')

輸出:

LOOP Time used: 20.85917043685913 sec
frompyfunc Time used: 12.103625059127808 sec

可以看出,程式碼方便了很多,但速度提高不明顯,接下來會探究如何提高速度

歡迎關注公眾號,獲取更多精彩內容。公眾號將不定期更新精品技術部落格、學習心得