python - একটি NumPy অ্যারে প্রতিটি কক্ষে একটি ফাংশন দক্ষ মূল্যায়ন




performance function vectorization (5)

যদি আপনি সংখ্যা এবং f(A(i,j)) = f(A(j,i)) , আপনি scipy.spatial.distance.cdist ব্যবহার করতে পারেন f কে A(i) এবং A(j) মধ্যে দূরত্ব হিসাবে নির্ধারণ করতে পারেন A(j)

একটি NumPy অ্যারে A কে দেওয়া হয়েছে , একই ফাংশনটি প্রয়োগ করতে দ্রুততম / সর্বাধিক কার্যকরী উপায়, , প্রতি কোষে?

  1. ধরুন আমরা একটি (i, j) f (A (i, j)) বরাদ্দ করব।

  2. ফাংশন, f , একটি বাইনারি আউটপুট নেই, এইভাবে মুখোশ (ing) ক্রিয়াকলাপগুলি সহায়তা করবে না।

"সুস্পষ্ট" ডবল লুপ পুনরাবৃত্তি (প্রতি সেল মাধ্যমে) সর্বোত্তম সমাধান?


আপনি কেবল ফাংশনকে vectorize করতে পারেন এবং তারপরে প্রতিবার যখন এটি প্রয়োজন তখন এটি সরাসরি একটি নিম্পি অ্যারে প্রয়োগ করুন:

import numpy as np

def f(x):
    return x * x + 3 * x - 2 if x > 0 else x * 5 + 8

f = np.vectorize(f)  # or use a different name if you want to keep the original f

result_array = f(A)  # if A is your Numpy array

ভেক্টরাইজ করার সময় এটি সরাসরি একটি স্পষ্ট আউটপুট টাইপ নির্দিষ্ট করতে ভাল:

f = np.vectorize(f, otypes=[np.float])

আমি বিশ্বাস করি আমি একটি ভাল সমাধান খুঁজে পেয়েছি। ফাংশনটি পাইথন সর্বজনীন ফাংশনে পরিবর্তন করতে ( documentation ), যা হুডের সমান্তরাল গণনা অনুশীলন করতে পারে।

কেউ নিজের নিজস্ব কাস্টমাইজড ufunc লিখতে পারে, যা নিশ্চয়ই আরও কার্যকর, বা np.frompyfunc যা ফ্যাক্টরি পদ্ধতিতে অন্তর্নির্মিত। পরীক্ষার পর, এটি np.vectorize চেয়ে আরও কার্যকর:

f = lambda x, y: x * y
f_arr = np.frompyfunc(f, 2, 1)
vf = np.vectorize(f)
arr = np.linspace(0, 1, 10000)

%timeit f_arr(arr, arr) # 307ms
%timeit f_arr(arr, arr) # 450ms

আমি বড় নমুনা পরীক্ষা করেছি, এবং উন্নতি আনুপাতিক হয়। অন্যান্য পদ্ধতির পারফরমেন্স তুলনা জন্য, এই পোস্টটি দেখুন



পাইপ, setuptools / easy_install এর একটি বিকল্প, একটি "আনইনস্টল" কমান্ড সরবরাহ করে।

ইনস্টলেশন নির্দেশাবলী অনুযায়ী পিপ ইনস্টল করুন:

$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py

তারপর আপনি easy_install সঙ্গে ইনস্টল করা প্যাকেজ অপসারণ easy_install pip uninstall ব্যবহার করতে পারেন





python performance function numpy vectorization