Numpy: tìm nhanh chỉ số giá trị đầu tiên


105

Làm cách nào để tìm chỉ mục của lần xuất hiện đầu tiên của một số trong mảng Numpy? Tốc độ là quan trọng đối với tôi. Tôi không quan tâm đến các câu trả lời sau vì chúng quét toàn bộ mảng và không dừng lại khi chúng tìm thấy lần xuất hiện đầu tiên:

itemindex = numpy.where(array==item)[0][0]
nonzero(array == item)[0][0]

Lưu ý 1: không có câu trả lời nào từ câu hỏi đó có vẻ liên quan Có hàm Numpy để trả về chỉ mục đầu tiên của thứ gì đó trong một mảng không?

Lưu ý 2: sử dụng phương thức biên dịch C được ưu tiên hơn một vòng lặp Python.

Câu trả lời:



30

Mặc dù đã quá muộn đối với bạn, nhưng để tham khảo trong tương lai: Sử dụng numba ( 1 ) là cách dễ nhất cho đến khi numpy triển khai nó. Nếu bạn sử dụng phân phối python anaconda, nó đã được cài đặt. Mã sẽ được biên dịch nên sẽ nhanh chóng.

@jit(nopython=True)
def find_first(item, vec):
    """return the index of the first occurence of item in vec"""
    for i in xrange(len(vec)):
        if item == vec[i]:
            return i
    return -1

và sau đó:

>>> a = array([1,7,8,32])
>>> find_first(8,a)
2

4
Đối với python3 xrangecần được thay đổi cho range.

Cải thiện một chút mã trong Python 3+: sử dụng enumerate, như trong for i, v in enumerate(vec):; if v == item: return i. (Đây không phải là một ý tưởng hay trong Python <= 2.7, nơi enumeratetạo một danh sách hơn là một trình lặp cơ bản.)
acdr

23

Tôi đã thực hiện một điểm chuẩn cho một số phương pháp:

  • argwhere
  • nonzero như trong câu hỏi
  • .tostring() như trong câu trả lời của @Rob Reilink
  • vòng lặp trăn
  • Vòng lặp Fortran

PythonFortran có sẵn. Tôi đã bỏ qua những thứ không khuyến khích như chuyển đổi thành một danh sách.

Các kết quả trên thang log. Trục X là vị trí của kim (mất nhiều thời gian hơn để tìm xem nó có nằm sâu hơn trong mảng hay không); giá trị cuối cùng là một kim không có trong mảng. Trục Y là thời điểm để tìm ra nó.

kết quả điểm chuẩn

Mảng có 1 triệu phần tử và các thử nghiệm đã được chạy 100 lần. Kết quả vẫn dao động một chút, nhưng xu hướng định tính là rõ ràng: Python và f2py bỏ ở phần tử đầu tiên nên chúng mở rộng quy mô khác nhau. Python trở nên quá chậm nếu kim không nằm trong 1% đầu tiên, ngược lại f2pylà nhanh (nhưng bạn cần phải biên dịch nó).

Tóm lại, f2py là giải pháp nhanh nhất , đặc biệt nếu kim xuất hiện khá sớm.

Nó không được xây dựng trong đó gây khó chịu, nhưng nó thực sự chỉ là 2 phút làm việc. Thêm cái này vào một tệp có tên search.f90:

subroutine find_first(needle, haystack, haystack_length, index)
    implicit none
    integer, intent(in) :: needle
    integer, intent(in) :: haystack_length
    integer, intent(in), dimension(haystack_length) :: haystack
!f2py intent(inplace) haystack
    integer, intent(out) :: index
    integer :: k
    index = -1
    do k = 1, haystack_length
        if (haystack(k)==needle) then
            index = k - 1
            exit
        endif
    enddo
end

Nếu bạn đang tìm kiếm thứ gì đó khác integer, chỉ cần thay đổi loại. Sau đó, biên dịch bằng cách sử dụng:

f2py -c -m search search.f90

sau đó bạn có thể làm (từ Python):

import search
print(search.find_first.__doc__)
a = search.find_first(your_int_needle, your_int_array)

2
Tại sao f2py1 mục lại chậm hơn 10?
Eric

2
@Eric, tôi đoán rằng ở các thang đo đó (10e-6), đó chỉ là nhiễu dữ liệu và tốc độ thực tế trên mỗi mục quá nhanh nên nó không đóng góp một cách có ý nghĩa vào thời gian tổng thể ở n <100 hoặc lâu hơn
Brendan,

11

Bạn có thể chuyển đổi một mảng boolean thành một chuỗi Python bằng cách sử dụng array.tostring()và sau đó sử dụng phương thức find ():

(array==item).tostring().find('\x01')

Tuy nhiên, điều này liên quan đến việc sao chép dữ liệu, vì các chuỗi Python cần phải là bất biến. Một lợi thế là bạn cũng có thể tìm kiếm ví dụ như cạnh tăng bằng cách tìm\x00\x01


Điều này thật thú vị, nhưng hầu như không nhanh hơn, nếu có, vì bạn vẫn cần xử lý tất cả dữ liệu (xem câu trả lời của tôi để biết điểm chuẩn).
Đánh dấu

10

Trong trường hợp các mảng được sắp xếp np.searchsortedhoạt động.


2
Nếu mảng không có mục này ở tất cả độ dài mảng sẽ được trả về.
Boris Tsema

7

Tôi nghĩ rằng bạn đã gặp phải một vấn đề mà một phương pháp khác và một số kiến thức tiên nghiệm về mảng sẽ thực sự hữu ích. Loại thứ mà bạn có xác suất X tìm thấy câu trả lời của mình trong phần trăm Y đầu tiên của dữ liệu. Việc chia nhỏ vấn đề với hy vọng may mắn sau đó thực hiện điều này trong python với khả năng hiểu danh sách lồng nhau hoặc một cái gì đó.

Viết một hàm C để thực hiện điều này cũng không quá khó khi sử dụng ctypes .

Mã C mà tôi đã hack cùng nhau (index.c):

long index(long val, long *data, long length){
    long ans, i;
    for(i=0;i<length;i++){
        if (data[i] == val)
            return(i);
    }
    return(-999);
}

và con trăn:

# to compile (mac)
# gcc -shared index.c -o index.dylib
import ctypes
lib = ctypes.CDLL('index.dylib')
lib.index.restype = ctypes.c_long
lib.index.argtypes = (ctypes.c_long, ctypes.POINTER(ctypes.c_long), ctypes.c_long)

import numpy as np
np.random.seed(8675309)
a = np.random.random_integers(0, 100, 10000)
print lib.index(57, a.ctypes.data_as(ctypes.POINTER(ctypes.c_long)), len(a))

và tôi nhận được 92.

Kết thúc python thành một chức năng thích hợp và bạn hoàn thành.

Phiên bản C nhanh hơn rất nhiều (~ 20x) đối với hạt giống này (cảnh báo tôi không giỏi về thời gian)

import timeit
t = timeit.Timer('np.where(a==57)[0][0]', 'import numpy as np; np.random.seed(1); a = np.random.random_integers(0, 1000000, 10000000)')
t.timeit(100)/100
# 0.09761879920959472
t2 = timeit.Timer('lib.index(57, a.ctypes.data_as(ctypes.POINTER(ctypes.c_long)), len(a))', 'import numpy as np; np.random.seed(1); a = np.random.random_integers(0, 1000000, 10000000); import ctypes; lib = ctypes.CDLL("index.dylib"); lib.index.restype = ctypes.c_long; lib.index.argtypes = (ctypes.c_long, ctypes.POINTER(ctypes.c_long), ctypes.c_long) ')
t2.timeit(100)/100
# 0.005288000106811523

1
Nếu mảng là nhân đôi (hãy nhớ số float của python là C gấp đôi theo mặc định) thì bạn phải suy nghĩ kỹ hơn một chút vì == không thực sự an toàn hoặc những gì bạn muốn cho các giá trị dấu phẩy động. Cũng đừng quên rằng đó là một ý tưởng thực sự hay khi sử dụng ctypes để nhập các mảng numpy của bạn.
Brian Larsen

Cảm ơn @Brian Larsen. Tôi có lẽ sẽ thử. Tôi nghĩ đó là một yêu cầu tính năng nhỏ cho bản sửa đổi tiếp theo.
cyborg

5

@tal đã trình bày một numbahàm để tìm chỉ mục đầu tiên nhưng điều đó chỉ hoạt động đối với mảng 1D. Với np.ndenumeratebạn cũng có thể tìm chỉ mục đầu tiên trong một mảng có chiều tùy ý:

from numba import njit
import numpy as np

@njit
def index(array, item):
    for idx, val in np.ndenumerate(array):
        if val == item:
            return idx
    return None

Trường hợp mẫu:

>>> arr = np.arange(9).reshape(3,3)
>>> index(arr, 3)
(1, 0)

Thời gian cho thấy nó có hiệu suất tương tự như giải pháp tals :

arr = np.arange(100000)
%timeit index(arr, 5)           # 1000000 loops, best of 3: 1.88 µs per loop
%timeit find_first(5, arr)      # 1000000 loops, best of 3: 1.7 µs per loop

%timeit index(arr, 99999)       # 10000 loops, best of 3: 118 µs per loop
%timeit find_first(99999, arr)  # 10000 loops, best of 3: 96 µs per loop

1
Nếu bạn quan tâm hơn nữa đến việc tìm kiếm dọc theo một trục nhất định trước: Hãy chuyển vị trí arraytrước khi đưa nó vào np.ndenumerate, sao cho trục quan tâm của bạn đến trước.
CheshireCat

Cảm ơn, đây thực sự là thứ tự cường độ nhanh hơn: từ ~ 171ms ( np.argwhere) đến 717ns (giải pháp của bạn), cho cả một mảng hình dạng (3000000, 12)).
Arthur Colombini Gusmão

3

Nếu danh sách của bạn được sắp xếp , bạn có thể tìm kiếm chỉ mục rất nhanh với gói 'bisect'. Đó là O (log (n)) thay vì O (n).

bisect.bisect(a, x)

tìm x trong mảng a, chắc chắn nhanh hơn trong trường hợp được sắp xếp so với bất kỳ quy trình C nào đi qua tất cả các phần tử đầu tiên (đối với danh sách đủ dài).

Thật tốt khi biết đôi khi.


>>> cond = "import numpy as np;a = np.arange(40)" timeit("np.searchsorted(a, 39)", cond)hoạt động trong 3,47867107391 giây. timeit("bisect.bisect(a, 39)", cond2)hoạt động trong 7,0661458969116 giây. Có vẻ như numpy.searchsortedtốt hơn cho các mảng được sắp xếp (ít nhất là đối với số nguyên).
Boris Tsema

2

Theo như tôi biết chỉ có np.any và np.all trên mảng boolean là bị đoản mạch.

Trong trường hợp của bạn, numpy phải đi qua toàn bộ mảng hai lần, một lần để tạo điều kiện boolean và lần thứ hai để tìm các chỉ số.

Khuyến nghị của tôi trong trường hợp này là sử dụng cython. Tôi nghĩ sẽ dễ dàng điều chỉnh một ví dụ cho trường hợp này, đặc biệt nếu bạn không cần nhiều sự linh hoạt cho các loại và hình dạng khác nhau.


2

Tôi cần điều này cho công việc của mình vì vậy tôi đã tự học Python và giao diện C của Numpy và tự viết. http://pastebin.com/GtcXuLyd Nó chỉ dành cho mảng 1-D, nhưng hoạt động với hầu hết các kiểu dữ liệu (int, float hoặc string) và thử nghiệm cho thấy nó nhanh hơn khoảng 20 lần so với cách tiếp cận dự kiến ​​trong Python- numpy.


2

Vấn đề này có thể được giải quyết một cách hiệu quả trong numpy thuần túy bằng cách xử lý mảng theo từng phần:

def find_first(x):
    idx, step = 0, 32
    while idx < x.size:
        nz, = x[idx: idx + step].nonzero()
        if len(nz): # found non-zero, return it
            return nz[0] + idx
        # move to the next chunk, increase step
        idx += step
        step = min(9600, step + step // 2)
    return -1

Mảng được xử lý theo kích thước phân đoạn step. Bước này stepcàng dài thì việc xử lý mảng zeroed càng nhanh (trường hợp xấu nhất). Nó càng nhỏ thì việc xử lý mảng có khác 0 ở đầu càng nhanh. Bí quyết là hãy bắt đầu với mộtstep và tăng nó lên theo cấp số nhân. Hơn nữa, không cần thiết phải tăng nó trên một số ngưỡng do lợi ích hạn chế.

Tôi đã so sánh giải pháp với giải pháp ndarary.nonzero và numba thuần túy với 10 triệu mảng float.

import numpy as np
from numba import jit
from timeit import timeit

def find_first(x):
    idx, step = 0, 32
    while idx < x.size:
        nz, = x[idx: idx + step].nonzero()
        if len(nz):
            return nz[0] + idx
        idx += step
        step = min(9600, step + step // 2)
    return -1

@jit(nopython=True)
def find_first_numba(vec):
    """return the index of the first occurence of item in vec"""
    for i in range(len(vec)):
        if vec[i]:
            return i
    return -1


SIZE = 10_000_000
# First only
x = np.empty(SIZE)

find_first_numba(x[:10])

print('---- FIRST ----')
x[:] = 0
x[0] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=1000), 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=1000), 'ms')

print('---- LAST ----')
x[:] = 0
x[-1] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

print('---- NONE ----')
x[:] = 0
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

print('---- ALL ----')
x[:] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

Và kết quả trên máy của tôi:

---- FIRST ----
ndarray.nonzero 54.733994480002366 ms
find_first 0.0013148509997336078 ms
find_first_numba 0.0002839310000126716 ms
---- LAST ----
ndarray.nonzero 54.56336712999928 ms
find_first 25.38929685000312 ms
find_first_numba 8.022820680002951 ms
---- NONE ----
ndarray.nonzero 24.13432420999925 ms
find_first 25.345200140000088 ms
find_first_numba 8.154927100003988 ms
---- ALL ----
ndarray.nonzero 55.753537260002304 ms
find_first 0.0014760300018679118 ms
find_first_numba 0.0004358099977253005 ms

Thuần túy ndarray.nonzerolà lỏng lẻo nhất định. Giải pháp numba nhanh hơn khoảng 5 lần cho trường hợp tốt nhất. Nó nhanh hơn khoảng 3 lần trong trường hợp xấu nhất.


2

Nếu bạn đang tìm kiếm phần tử khác 0 đầu tiên, bạn có thể sử dụng một cách hack sau:

idx = x.view(bool).argmax() // x.itemsize
idx = idx if x[idx] else -1

Đây là một giải pháp "numpy-pure" rất nhanh nhưng nó không thành công đối với một số trường hợp được thảo luận dưới đây.

Giải pháp tận dụng lợi thế từ thực tế là hầu hết các biểu diễn của số 0 cho các kiểu số đều bao gồm các 0byte. Nó cũng áp dụng cho numpy's bool. Trong các phiên bản gần đây của numpy, argmax()hàm sử dụng logic ngắn mạch khi xử lý boolkiểu. Kích thước của boollà 1 byte.

Vì vậy, một người cần phải:

  • tạo một khung nhìn của mảng dưới dạng bool. Không có bản sao nào được tạo
  • sử dụng argmax()để tìm byte khác 0 đầu tiên bằng logic ngắn mạch
  • tính toán lại độ lệch của byte này thành chỉ số của phần tử khác 0 đầu tiên bằng phép chia số nguyên (toán tử //) của phần bù theo kích thước của một phần tử đơn lẻ được biểu thị bằng byte ( x.itemsize)
  • kiểm tra xem x[idx]có thực sự khác 0 không để xác định trường hợp không có khác 0

Tôi đã thực hiện một số điểm chuẩn so với giải pháp numba và xây dựng nó np.nonzero.

import numpy as np
from numba import jit
from timeit import timeit

def find_first(x):
    idx = x.view(bool).argmax() // x.itemsize
    return idx if x[idx] else -1

@jit(nopython=True)
def find_first_numba(vec):
    """return the index of the first occurence of item in vec"""
    for i in range(len(vec)):
        if vec[i]:
            return i
    return -1


SIZE = 10_000_000
# First only
x = np.empty(SIZE)

find_first_numba(x[:10])

print('---- FIRST ----')
x[:] = 0
x[0] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=1000), 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=1000), 'ms')

print('---- LAST ----')
x[:] = 0
x[-1] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

print('---- NONE ----')
x[:] = 0
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

print('---- ALL ----')
x[:] = 1
print('ndarray.nonzero', timeit(lambda: x.nonzero()[0][0], number=100)*10, 'ms')
print('find_first', timeit(lambda: find_first(x), number=100)*10, 'ms')
print('find_first_numba', timeit(lambda: find_first_numba(x), number=100)*10, 'ms')

Kết quả trên máy của tôi là:

---- FIRST ----
ndarray.nonzero 57.63976670001284 ms
find_first 0.0010841979965334758 ms
find_first_numba 0.0002308919938514009 ms
---- LAST ----
ndarray.nonzero 58.96685277999495 ms
find_first 5.923203580023255 ms
find_first_numba 8.762269750004634 ms
---- NONE ----
ndarray.nonzero 25.13398071998381 ms
find_first 5.924289370013867 ms
find_first_numba 8.810063839919167 ms
---- ALL ----
ndarray.nonzero 55.181210660084616 ms
find_first 0.001246920000994578 ms
find_first_numba 0.00028766007744707167 ms

Giải pháp này nhanh hơn 33% so với numba và nó là "numpy-pure".

Những bất lợi:

  • không hoạt động cho các loại numpy được chấp nhận như object
  • không thành công với số 0 âm thỉnh thoảng xuất hiện trong floathoặc doubletính toán

đây là giải pháp numpy tinh khiết tốt nhất mà tôi đã thử. nên được chấp nhận câu trả lời. @tstanisl Tôi đã cố gắng có được một giải pháp nhanh tương tự để tìm phần tử 0 đầu tiên trong một mảng nhưng nó luôn kết thúc chậm hơn so với chuyển đổi thành bool rồi chạy argmin (). bất kỳ ý tưởng?
Ta946

1
@ Ta946. Không thể sử dụng thủ thuật này khi tìm kiếm các mục nhập không. Ví dụ: mã kép khác 0 có thể chứa byte 0 trong đó. Nếu bạn tìm kiếm giải pháp tinh khiết, hãy thử sửa đổi câu trả lời khác của tôi . Xem stackoverflow.com/a/58294774/4989451 . Chỉ cần phủ định một lát xtrước khi gọi nonzero(). Nó có thể sẽ chậm hơn numba nhưng nó ** sẽ không ** tìm kiếm trong toàn bộ mảng trong khi tìm mục nhập số 0 đầu tiên, do đó nó có thể đủ nhanh cho nhu cầu của bạn.
tstanisl

1

Là một người dùng matlab lâu năm, tôi đã tìm kiếm một giải pháp hiệu quả cho vấn đề này trong một thời gian. Cuối cùng, được thúc đẩy bởi các cuộc thảo luận, một mệnh đề trong chuỗi này, tôi đã cố gắng đưa ra giải pháp triển khai một API tương tự như những gì được đề xuất ở đây , hiện tại chỉ hỗ trợ các mảng 1D.

Bạn sẽ sử dụng nó như thế này

import numpy as np
import utils_find_1st as utf1st
array = np.arange(100000)
item = 1000
ind = utf1st.find_1st(array, item, utf1st.cmp_larger_eq)

Các toán tử điều kiện được hỗ trợ là: cmp_equal, cmp_not_equal, cmp_larger, cmp_smaller, cmp_larger_eq, cmp_smaller_eq. Để có hiệu quả, phần mở rộng được viết bằng c.

Bạn tìm thấy nguồn, điểm chuẩn và các chi tiết khác tại đây:

https://pypi.python.org/pypi?name=py_find_1st&:action=display

để sử dụng trong nhóm của chúng tôi (anaconda trên linux và macos) Tôi đã tạo một trình cài đặt anaconda giúp đơn giản hóa việc cài đặt, bạn có thể sử dụng nó như được mô tả ở đây

https://anaconda.org/roebel/py_find_1st


"Là một người dùng matlab lâu năm" - cách viết của Matlab cho điều này là gì?
Eric

find (X, n) tìm n chỉ số đầu tiên trong đó X khác 0. mathworks.com/help/matlab/ref/find.html
A Roebel

0

Chỉ cần lưu ý rằng nếu bạn đang thực hiện một chuỗi tìm kiếm, thì hiệu suất đạt được từ việc thực hiện điều gì đó thông minh như chuyển đổi thành chuỗi, có thể bị mất trong vòng lặp ngoài nếu thứ nguyên tìm kiếm không đủ lớn. Xem hiệu suất của việc lặp lại find1 sử dụng thủ thuật chuyển đổi chuỗi được đề xuất ở trên và find2 sử dụng argmax dọc theo trục bên trong (cộng với điều chỉnh để đảm bảo trả về không khớp là -1)

import numpy,time
def find1(arr,value):
    return (arr==value).tostring().find('\x01')

def find2(arr,value): #find value over inner most axis, and return array of indices to the match
    b = arr==value
    return b.argmax(axis=-1) - ~(b.any())


for size in [(1,100000000),(10000,10000),(1000000,100),(10000000,10)]:
    print(size)
    values = numpy.random.choice([0,0,0,0,0,0,0,1],size=size)
    v = values>0

    t=time.time()
    numpy.apply_along_axis(find1,-1,v,1)
    print('find1',time.time()-t)

    t=time.time()
    find2(v,1)
    print('find2',time.time()-t)

đầu ra

(1, 100000000)
('find1', 0.25300002098083496)
('find2', 0.2780001163482666)
(10000, 10000)
('find1', 0.46200013160705566)
('find2', 0.27300000190734863)
(1000000, 100)
('find1', 20.98099994659424)
('find2', 0.3040001392364502)
(10000000, 10)
('find1', 206.7590000629425)
('find2', 0.4830000400543213)

Điều đó nói rằng, một kết quả được viết bằng C sẽ nhanh hơn một chút so với một trong hai cách tiếp cận này


0

Còn cái này thì sao

import numpy as np
np.amin(np.where(array==item))

2
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích.
Toby Speight

1
Tôi khá chắc rằng điều này thậm chí còn chậm hơn so với where(array==item)[0][0]câu hỏi ...
Đánh dấu

-1

Bạn có thể giấu mảng của mình thành một listvà sử dụng index()phương pháp của nó :

i = list(array).index(item)

Theo như tôi biết, đây là một phương pháp được biên dịch C.


3
này có khả năng là nhiều lần chậm hơn so với chỉ dùng kết quả đầu tiên từ np.where
CWA

1
rất đúng .. Tôi đã sử dụng timeit()trên một mảng 10000 số nguyên - chuyển đổi thành danh sách chậm hơn khoảng 100 lần! Tôi đã quên rằng cấu trúc dữ liệu cơ bản cho một mảng NumPy là rất khác nhau từ một danh sách ..
drevicko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.