सुपीरियर सरणी पर फ़ंक्शन को मैप करने का सबसे कुशल तरीका


337

एक सुपीरियर सरणी पर फ़ंक्शन को मैप करने का सबसे कुशल तरीका क्या है? जिस तरह से मैं अपनी वर्तमान परियोजना में कर रहा हूं वह इस प्रकार है:

import numpy as np 

x = np.array([1, 2, 3, 4, 5])

# Obtain array of square of each element in x
squarer = lambda t: t ** 2
squares = np.array([squarer(xi) for xi in x])

हालाँकि, ऐसा लगता है कि यह शायद बहुत अक्षम है, क्योंकि मैं एक पायनियर सूची के रूप में नए सरणी का निर्माण करने के लिए एक सूची समझ का उपयोग कर रहा हूं, इसे वापस एक संख्यात्मक सरणी में परिवर्तित करने से पहले।

क्या हम बेहतर कर सकते हैं?


10
क्यों नहीं "वर्ग = x ** 2"? क्या आपके पास मूल्यांकन करने के लिए बहुत अधिक जटिल कार्य है?
22

4
केवल के बारे में कैसे squarer(x)?
जीवन

1
शायद यह सीधे सवाल का जवाब नहीं दे रहा है, लेकिन मैंने सुना है कि सुंबा मौजूदा अजगर कोड को समानांतर मशीन निर्देशों में संकलित कर सकता है। मैं इस पोस्ट को फिर से देखूंगा और संशोधित करूंगा जब मुझे वास्तव में इसका उपयोग करने का मौका मिलेगा।
把 留 在 ''

x = np.array([1, 2, 3, 4, 5]); x**2काम करता है
शार्क डेंग

जवाबों:


281

मैंने सभी सुझाए गए तरीकों के np.array(map(f, x))साथ perfplot(मेरी एक छोटी परियोजना) का परीक्षण किया है ।

संदेश # 1: यदि आप सुन्न के मूल कार्यों का उपयोग कर सकते हैं, तो ऐसा करें।

यदि आप जिस फ़ंक्शन को पहले से ही वेक्टर करने की कोशिश कर रहे हैं, वह वेक्टराइज़ किया गया है (जैसे x**2मूल पोस्ट में उदाहरण), तो इसका उपयोग करना किसी भी चीज़ की तुलना में बहुत तेज़ है (लॉग स्केल पर ध्यान दें):

यहां छवि विवरण दर्ज करें

यदि आपको वास्तव में वैश्वीकरण की आवश्यकता है, तो यह वास्तव में बहुत ज्यादा मायने नहीं रखता है कि आप किस संस्करण का उपयोग करते हैं।

यहां छवि विवरण दर्ज करें


भूखंडों को पुन: उत्पन्न करने के लिए कोड:

import numpy as np
import perfplot
import math


def f(x):
    # return math.sqrt(x)
    return np.sqrt(x)


vf = np.vectorize(f)


def array_for(x):
    return np.array([f(xi) for xi in x])


def array_map(x):
    return np.array(list(map(f, x)))


def fromiter(x):
    return np.fromiter((f(xi) for xi in x), x.dtype)


def vectorize(x):
    return np.vectorize(f)(x)


def vectorize_without_init(x):
    return vf(x)


perfplot.show(
    setup=lambda n: np.random.rand(n),
    n_range=[2 ** k for k in range(20)],
    kernels=[f, array_for, array_map, fromiter, vectorize, vectorize_without_init],
    xlabel="len(x)",
)

7
लगता है आप f(x)अपने प्लॉट से बाहर निकल गए हैं। यह हर के लिए लागू नहीं हो सकता है f, लेकिन यह यहाँ लागू है, और यह लागू होने पर सबसे तेज़ समाधान है।
user2357112

2
साथ ही, आपका प्लॉट vf = np.vectorize(f); y = vf(x)शॉर्ट इनपुट्स के लिए जीतने वाले आपके दावे का समर्थन नहीं करता है।
user2357112

Perfplot (v0.3.2) को पाइप के माध्यम से स्थापित करने के बाद ( pip install -U perfplot), मैं संदेश देखता हूं: AttributeError: 'module' object has no attribute 'save'उदाहरण कोड चिपकाते समय।
tsherwen

पाश के लिए एक वेनिला के बारे में क्या?
कैटिगर ३३३१

1
@Vlad ने टिप्पणी के रूप में बस math.sqrt का उपयोग किया।
निको श्लोमर

138

कैसे उपयोग करने के बारे numpy.vectorize

import numpy as np
x = np.array([1, 2, 3, 4, 5])
squarer = lambda t: t ** 2
vfunc = np.vectorize(squarer)
vfunc(x)
# Output : array([ 1,  4,  9, 16, 25])

36
यह कोई अधिक कुशल नहीं है।
user2357112

78
उस डॉक्टर से: The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop. अन्य प्रश्नों में मैंने पाया कि vectorizeउपयोगकर्ता पुनरावृत्ति गति को दोगुना कर सकता है। लेकिन वास्तविक स्पीडअप वास्तविक numpyसरणी संचालन के साथ है।
हंपुलज

2
ध्यान दें कि वेक्टराइज़ कम से कम चीजों को गैर -1 डी सरणियों के लिए काम करता है
एरिक

लेकिन squarer(x)पहले से ही गैर-1 डी सरणियों के लिए काम करेगा। vectorizeकेवल वास्तव में किसी सूची की समझ पर कोई लाभ है (जैसे प्रश्न में एक), पर नहीं squarer(x)
user2357112

79

टी एल; डॉ

जैसा कि @ user2357112 द्वारा उल्लेख किया गया है , फ़ंक्शन को लागू करने का एक "सीधा" तरीका हमेशा सबसे तेज़ और सरल तरीका है जो किसी भी प्रकार के Numpy सरणियों पर कार्य करता है:

import numpy as np
x = np.array([1, 2, 3, 4, 5])
f = lambda x: x ** 2
squares = f(x)

आम तौर पर बचें np.vectorize, क्योंकि यह अच्छा प्रदर्शन नहीं करता है, और कई मुद्दों पर है (या है) । यदि आप अन्य डेटा प्रकारों को संभाल रहे हैं, तो आप नीचे दिखाए गए अन्य तरीकों की जांच करना चाह सकते हैं।

तरीकों की तुलना

एक फ़ंक्शन को मैप करने के लिए तीन तरीकों की तुलना करने के लिए यहां कुछ सरल परीक्षण दिए गए हैं, यह उदाहरण पायथन 3.6 और न्यूपे 1.15.4 के साथ उपयोग किया गया है। सबसे पहले, परीक्षण के लिए सेट-अप कार्य:

import timeit
import numpy as np

f = lambda x: x ** 2
vf = np.vectorize(f)

def test_array(x, n):
    t = timeit.timeit(
        'np.array([f(xi) for xi in x])',
        'from __main__ import np, x, f', number=n)
    print('array: {0:.3f}'.format(t))

def test_fromiter(x, n):
    t = timeit.timeit(
        'np.fromiter((f(xi) for xi in x), x.dtype, count=len(x))',
        'from __main__ import np, x, f', number=n)
    print('fromiter: {0:.3f}'.format(t))

def test_direct(x, n):
    t = timeit.timeit(
        'f(x)',
        'from __main__ import x, f', number=n)
    print('direct: {0:.3f}'.format(t))

def test_vectorized(x, n):
    t = timeit.timeit(
        'vf(x)',
        'from __main__ import x, vf', number=n)
    print('vectorized: {0:.3f}'.format(t))

पांच तत्वों के साथ परीक्षण (सबसे तेज़ से धीमी गति से हल किया गया):

x = np.array([1, 2, 3, 4, 5])
n = 100000
test_direct(x, n)      # 0.265
test_fromiter(x, n)    # 0.479
test_array(x, n)       # 0.865
test_vectorized(x, n)  # 2.906

100 तत्वों के साथ:

x = np.arange(100)
n = 10000
test_direct(x, n)      # 0.030
test_array(x, n)       # 0.501
test_vectorized(x, n)  # 0.670
test_fromiter(x, n)    # 0.883

और सरणी तत्वों या अधिक के साथ:

x = np.arange(1000)
n = 1000
test_direct(x, n)      # 0.007
test_fromiter(x, n)    # 0.479
test_array(x, n)       # 0.516
test_vectorized(x, n)  # 0.945

Python / NumPy और संकलक अनुकूलन के विभिन्न संस्करणों के अलग-अलग परिणाम होंगे, इसलिए अपने पर्यावरण के लिए एक समान परीक्षण करें।


2
यदि आप countतर्क और एक जनरेटर अभिव्यक्ति का उपयोग करते हैं तो np.fromiterकाफी तेज है।
juanpa.arrivillaga

3
इसलिए, उदाहरण के लिए, का उपयोग करें'np.fromiter((f(xi) for xi in x), x.dtype, count=len(x))'
juanpa.arrivillaga

4
आपने उस प्रत्यक्ष समाधान का परीक्षण नहीं किया f(x), जो परिमाण के एक क्रम से अधिक सब कुछ धड़कता है
user2357112

4
के बारे में क्या करता है, तो f2 वेरिएबल नहीं है और सरणी 2 डी है?
सिगुर

2
मैं उलझन में हूँ कि कैसे 'f (x)' संस्करण ("प्रत्यक्ष") वास्तव में तुलनीय माना जाता है जब ओपी एक सरणी में एक फ़ंक्शन "मैप" करने के लिए पूछ रहा था? F (x) = x ** 2 के मामले में, संपूर्ण सरणी के आधार पर पूरे सरणी पर numpy द्वारा प्रदर्शन किया जा रहा है। उदाहरण के लिए यदि f (x) 'लैम्ब्डा x: x + x' है तो इसका उत्तर बहुत अलग है क्योंकि अफीम एरे को एलीमेंट करने के बजाय एलीमेंट को जोड़ देता है। क्या यह वास्तव में अपेक्षित तुलना है? कृपया समझाएं।
एंड्रयू मेलिंगर

49

हैं numexpr , Numba और cython चारों ओर, इस उत्तर के लक्ष्य को ध्यान में इन संभावनाओं लेने के लिए है।

लेकिन पहले यह स्पष्ट करने दें: कोई फर्क नहीं पड़ता कि आप पायथन-फंक्शन को एक सुस्पष्ट-सरणी पर कैसे मैप करते हैं, यह एक पायथन फ़ंक्शन है, जिसका अर्थ है प्रत्येक मूल्यांकन के लिए:

  • numpy-array element को Python-object (जैसे a Float) में परिवर्तित किया जाना चाहिए ।
  • सभी गणना अजगर-वस्तुओं के साथ की जाती हैं, जिसका अर्थ है कि दुभाषिया, गतिशील प्रेषण और अपरिवर्तनीय वस्तुओं का ओवरहेड होना।

तो वास्तव में लूप के माध्यम से किस मशीनरी का उपयोग किया जाता है, ऊपर बताए गए ओवरहेड के कारण बड़ी भूमिका नहीं निभाती है - यह सुपीरियर की अंतर्निहित कार्यक्षमता का उपयोग करने की तुलना में बहुत धीमा रहता है।

आइए निम्नलिखित उदाहरण पर एक नज़र डालें:

# numpy-functionality
def f(x):
    return x+2*x*x+4*x*x*x

# python-function as ufunc
import numpy as np
vf=np.vectorize(f)
vf.__name__="vf"

np.vectorizeदृष्टिकोण के शुद्ध-पायथन फ़ंक्शन वर्ग के प्रतिनिधि के रूप में चुना गया है। उपयोग करना perfplot(इस उत्तर के परिशिष्ट में कोड देखें) हमें निम्नलिखित रनिंग टाइम मिलते हैं:

यहां छवि विवरण दर्ज करें

हम देख सकते हैं, कि शुद्ध अजगर संस्करण की तुलना में संख्यात्मक-दृष्टिकोण 10x-100x तेज है। बड़े सरणी-आकार के लिए प्रदर्शन में कमी संभवत: इसलिए है क्योंकि डेटा अब कैश को फिट नहीं करता है।

यह भी ध्यान देने योग्य है, कि vectorizeस्मृति का भी बहुत उपयोग होता है, इसलिए अक्सर मेमोरी-उपयोग बोतल-गर्दन (संबंधित एसओ-प्रश्न देखें ) है। यह भी ध्यान दें, उस खसरे के दस्तावेज में np.vectorizeकहा गया है कि यह "मुख्य रूप से सुविधा के लिए प्रदान किया गया है, प्रदर्शन के लिए नहीं"।

अन्य उपकरणों का उपयोग किया जाना चाहिए, जब प्रदर्शन वांछित होता है, तो खरोंच से सी-एक्सटेंशन लिखने के बाद, निम्नलिखित संभावनाएं होती हैं:


एक अक्सर सुनता है, कि सुन्न-प्रदर्शन जितना अच्छा होता है, क्योंकि यह हुड के नीचे शुद्ध सी होता है। फिर भी सुधार की बहुत गुंजाइश है!

वेक्टरित खस्ता-संस्करण बहुत अधिक अतिरिक्त मेमोरी और मेमोरी-एक्सेस का उपयोग करता है। न्यूमपी-लाइब्रेरी, खस्ता-सरणियों को टाइल करने की कोशिश करता है और इस तरह एक बेहतर कैश उपयोग प्राप्त होता है:

# less cache misses than numpy-functionality
import numexpr as ne
def ne_f(x):
    return ne.evaluate("x+2*x*x+4*x*x*x")

निम्नलिखित तुलना की ओर जाता है:

यहां छवि विवरण दर्ज करें

मैं ऊपर दिए गए कथानक में सब कुछ स्पष्ट नहीं कर सकता: हम शुरुआत में अंक-पुस्तकालय के लिए बड़ा ओवरहेड देख सकते हैं, लेकिन क्योंकि यह कैश का बेहतर उपयोग करता है, यह बड़ी सरणियों के लिए लगभग 10 गुना तेज है!


एक अन्य दृष्टिकोण है फंक्शन को जिट-संकलित करना और इस प्रकार एक वास्तविक शुद्ध-सी UFunc प्राप्त करना। यह सुब्बा का दृष्टिकोण है:

# runtime generated C-function as ufunc
import numba as nb
@nb.vectorize(target="cpu")
def nb_vf(x):
    return x+2*x*x+4*x*x*x

यह मूल संख्या-दृष्टिकोण की तुलना में 10 गुना तेज है:

यहां छवि विवरण दर्ज करें


हालाँकि, कार्य शर्मनाक रूप से समानांतर है, इस प्रकार हम भी prangeसमानांतर में लूप की गणना करने के लिए उपयोग कर सकते हैं :

@nb.njit(parallel=True)
def nb_par_jitf(x):
    y=np.empty(x.shape)
    for i in nb.prange(len(x)):
        y[i]=x[i]+2*x[i]*x[i]+4*x[i]*x[i]*x[i]
    return y

जैसा कि अपेक्षित था, छोटे आकार के लिए समानांतर फ़ंक्शन धीमा है, लेकिन बड़े आकारों के लिए तेज़ (लगभग कारक 2):

यहां छवि विवरण दर्ज करें


जबकि सुंबा, खस्ता-सरणियों के साथ संचालन को अनुकूलित करने में माहिर है, साइथन एक अधिक सामान्य उपकरण है। सुंबा के साथ समान प्रदर्शन को निकालने के लिए यह अधिक जटिल है - अक्सर यह स्थानीय कंपाइलर (gcc / MSVC) बनाम llvm (सुम्बा) के नीचे होता है:

%%cython -c=/openmp -a
import numpy as np
import cython

#single core:
@cython.boundscheck(False) 
@cython.wraparound(False) 
def cy_f(double[::1] x):
    y_out=np.empty(len(x))
    cdef Py_ssize_t i
    cdef double[::1] y=y_out
    for i in range(len(x)):
        y[i] = x[i]+2*x[i]*x[i]+4*x[i]*x[i]*x[i]
    return y_out

#parallel:
from cython.parallel import prange
@cython.boundscheck(False) 
@cython.wraparound(False)  
def cy_par_f(double[::1] x):
    y_out=np.empty(len(x))
    cdef double[::1] y=y_out
    cdef Py_ssize_t i
    cdef Py_ssize_t n = len(x)
    for i in prange(n, nogil=True):
        y[i] = x[i]+2*x[i]*x[i]+4*x[i]*x[i]*x[i]
    return y_out

साइथन कुछ हद तक धीमी गति से कार्य करता है:

यहां छवि विवरण दर्ज करें


निष्कर्ष

जाहिर है, केवल एक फ़ंक्शन के लिए परीक्षण कुछ भी साबित नहीं करता है। इसके अलावा, एक को ध्यान में रखना चाहिए, कि चुने हुए फ़ंक्शन-उदाहरण के लिए, मेमोरी की बैंडविड्थ 10 ^ 5 तत्वों से बड़े आकार के लिए बोतल की गर्दन थी - इस प्रकार इस क्षेत्र में सुंबा, सुपेक्सप्र और साइथन के लिए हमारे पास समान प्रदर्शन था।

अंत में, अल्टीमेटिव उत्तर फ़ंक्शन, हार्डवेयर, पायथन-वितरण और अन्य कारकों के प्रकार पर निर्भर करता है। उदाहरण के लिए एनाकोंडा-डिस्ट्रीब्यूशन इंटेल के वीएमएल का उपयोग सुपी के कार्यों के लिए करता है और इस प्रकार सुम्बा (जब तक कि यह एसवीएमएल का उपयोग नहीं करता है, तब तक एसओ-पोस्ट देखें ) exp, जैसे ट्रांसडेंटल फ़ंक्शंस के लिए आसानी से sin, cosऔर इसी तरह - निम्न एसओ-पोस्ट जैसे उदाहरण देखें ।

फिर भी इस जाँच से और मेरे अनुभव से, मैं बताता हूँ, कि सुंबा को सबसे अच्छा प्रदर्शन सबसे आसान उपकरण लगता है, जब तक कि कोई भी ट्रान्सेंडैंटल फ़ंक्शन शामिल न हो।


परफेक्ट प्लॉट के साथ प्लॉटिंग रनिंग टाइम:

import perfplot
perfplot.show(
    setup=lambda n: np.random.rand(n),
    n_range=[2**k for k in range(0,24)],
    kernels=[
        f, 
        vf,
        ne_f, 
        nb_vf, nb_par_jitf,
        cy_f, cy_par_f,
        ],
    logx=True,
    logy=True,
    xlabel='len(x)'
    )

1
नुम्बा इंटेल एसवीएमएल का उपयोग आमतौर पर कर सकता है, जिसके परिणामस्वरूप इंटेल वीएमएल की तुलना में काफी तुलनीय समय होता है, लेकिन कार्यान्वयन संस्करण (0.43-0.47) में थोड़ा छोटा है। मैंने आपके cy_exexum के लिए एक प्रदर्शन प्लॉट stackoverflow.com/a/56939240/4045774 जोड़ा है ।
मैक्स 9111

29
squares = squarer(x)

सरणियों पर अंकगणित संचालन स्वचालित रूप से लागू किया जाता है, कुशल सी-स्तरीय छोरों के साथ जो सभी दुभाषिया ओवरहेड से बचते हैं जो पायथन-स्तरीय लूप या समझ पर लागू होंगे।

अधिकांश फ़ंक्शन जिन्हें आप एक NumPy ऐरे पर लागू करना चाहते हैं एलीमेंट एलीमेंट वाइज बस काम करेंगे, हालांकि कुछ में बदलाव की आवश्यकता हो सकती है। उदाहरण के लिए, ifएलिमेंट वाइज काम नहीं करता है। आप उन निर्माणों का उपयोग करना चाहते हैं, जैसे numpy.where:

def using_if(x):
    if x < 5:
        return x
    else:
        return x**2

हो जाता है

def using_where(x):
    return numpy.where(x < 5, x, x**2)

8

मुझे विश्वास है कि नए संस्करण (मैं १.१३ का उपयोग करता हूँ) में खसखस ​​को आप फंक्शन को सुन्न सरणी में पास करके फ़ंक्शन को कॉल कर सकते हैं जिसे आपने स्केलर प्रकार के लिए लिखा था, यह स्वचालित रूप से फ़ंक्शन कॉल को प्रत्येक तत्व पर सुन्न सरणी पर लागू करेगा और आपको वापस कर देगा। एक और सुरीली सरणी

>>> import numpy as np
>>> squarer = lambda t: t ** 2
>>> x = np.array([1, 2, 3, 4, 5])
>>> squarer(x)
array([ 1,  4,  9, 16, 25])

3
यह दूर से नया नहीं है - यह हमेशा मामला रहा है - यह खस्ता की मुख्य विशेषताओं में से एक है।
एरिक

8
यह वह **ऑपरेटर है जो गणना को प्रत्येक तत्व t पर लागू कर रहा है t। वह साधारण सुन्न है। इसे लपेटकर lambdaकुछ भी अतिरिक्त नहीं करता है।
हंपुलज

यदि यह वर्तमान में दिखाया गया है तो यह कथन के साथ काम नहीं करता है।
TriHard8

8

कई मामलों में, numpy.apply_along_axis सबसे अच्छा विकल्प होगा। यह अन्य दृष्टिकोणों की तुलना में प्रदर्शन को लगभग 100 गुना तक बढ़ा देता है - और न केवल तुच्छ परीक्षण कार्यों के लिए, बल्कि अधिक जटिल फ़ंक्शन रचनाओं के लिए भी।

जब मैं विधि जोड़ता हूं:

def along_axis(x):
    return np.apply_along_axis(f, 0, x)

perfplot कोड के लिए, मुझे निम्नलिखित परिणाम मिलते हैं: यहां छवि विवरण दर्ज करें


मैं इस तथ्य को लेकर बेहद स्तब्ध हूं कि ज्यादातर लोगों को इतने सालों तक इस सरल, स्केलेबल और बिल्ट-इन-ब्रेनर के बारे में पता नहीं लगता है ....
बिल हुआंग

7

ऐसा लगता है कि किसी ने भी ufuncखट्टे पैकेज में उत्पादन की एक अंतर्निहित फैक्टरी विधि का उल्लेख नहीं किया है : np.frompyfuncजिसे मैंने फिर से परीक्षण किया है np.vectorizeऔर इसे लगभग 20 ~ 30% तक बढ़ा दिया है। निश्चित रूप से यह निर्धारित सी कोड या यहां तक ​​कि numba(जिसका मैंने परीक्षण नहीं किया है) अच्छा प्रदर्शन करेगा , लेकिन यह इससे बेहतर विकल्प हो सकता है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 vf(arr, arr) # 450ms

मैंने बड़े नमूनों का भी परीक्षण किया है, और सुधार आनुपातिक है। प्रलेखन भी यहाँ देखें


1
मैंने उपरोक्त समय परीक्षण को दोहराया, और लगभग 30% का प्रदर्शन सुधार (np.vectorize) भी पाया
जूलियन - BrainAnnex.org

2

जैसा कि इस पोस्ट में बताया गया है , बस जनरेटर के भावों का उपयोग करें जैसे:

numpy.fromiter((<some_func>(x) for x in <something>),<dtype>,<size of something>)

2

उपरोक्त सभी उत्तर अच्छी तरह से तुलना करते हैं, लेकिन अगर आपको मानचित्रण के लिए कस्टम फ़ंक्शन का उपयोग करने की आवश्यकता है, और आपके पास है numpy.ndarray, और आपको सरणी के आकार को बनाए रखने की आवश्यकता है।

मैंने सिर्फ दो की तुलना की है, लेकिन इसका आकार बरकरार रहेगा ndarray। मैंने तुलना के लिए 1 मिलियन प्रविष्टियों के साथ सरणी का उपयोग किया है। यहां मैं स्क्वायर फ़ंक्शन का उपयोग करता हूं, जो कि सुन्न में भी इनबिल्ट होता है और इसमें शानदार प्रदर्शन को बढ़ावा मिलता है, क्योंकि वहां कुछ की जरूरत थी, आप अपनी पसंद के फ़ंक्शन का उपयोग कर सकते हैं।

import numpy, time
def timeit():
    y = numpy.arange(1000000)
    now = time.time()
    numpy.array([x * x for x in y.reshape(-1)]).reshape(y.shape)        
    print(time.time() - now)
    now = time.time()
    numpy.fromiter((x * x for x in y.reshape(-1)), y.dtype).reshape(y.shape)
    print(time.time() - now)
    now = time.time()
    numpy.square(y)  
    print(time.time() - now)

उत्पादन

>>> timeit()
1.162431240081787    # list comprehension and then building numpy array
1.0775556564331055   # from numpy.fromiter
0.002948284149169922 # using inbuilt function

यहाँ आप स्पष्ट रूप numpy.fromiterसे सरल दृष्टिकोण पर विचार करते हुए शानदार काम कर सकते हैं , और यदि इनबिल्ट फ़ंक्शन उपलब्ध है तो कृपया इसका उपयोग करें।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.