정수 numpy 배열에 중간 float 배열없이 float 스칼라를 곱하기

PIRK

uint16축소 및 변환하려는 데이터의 매우 큰 이미지 배열을 다루고 uint8있습니다.

이 작업을 수행하는 초기 방법은 MemoryError중간 float64배열로 인해 발생했습니다 .

img = numpy.ones((29632, 60810, 3), dtype=numpy.uint16) 

if img.dtype == numpy.uint16:
    multiplier = numpy.iinfo(numpy.uint8).max / numpy.iinfo(numpy.uint16).max
    img = (img * multiplier).astype(numpy.uint8, order="C")

그런 다음 다음과 같은 방법으로 곱셈을 시도했습니다.

if img.dtype == numpy.uint16:
    multiplier = numpy.iinfo(numpy.uint8).max / numpy.iinfo(numpy.uint16).max
    img *= multiplier
    img = img.astype(numpy.uint8, order="C")

하지만 다음 오류가 발생합니다.

TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('uint16') with casting rule 'same_kind'

메모리 공간을 최소화하면서이 작업을 수행하는 방법을 알고 있습니까?

오류 메시지에 언급 된 캐스팅 규칙은 어디에서 변경할 수 있나요?

max9111

이러한 경우 Numba 또는 Cython을 사용할 수도 있습니다.

임시 배열을 명시 적으로 피할 수 있습니다. 코드는 조금 더 길지만 이해하기 쉽고 빠릅니다.

import numpy as np
import numba as nb

@nb.njit(parallel=True)
def conv_numba(img):
    multiplier = np.iinfo(np.uint8).max / np.iinfo(np.uint16).max
    img_out=np.empty(img.shape,dtype=np.uint8)
    for i in nb.prange(img.shape[0]):
        for j in range(img.shape[1]):
            for k in range(img.shape[2]):
                img_out[i,j,k]=img[i,j,k]*multiplier
    return img_out

#img_in have to be contigous, otherwise reshape will fail
@nb.njit(parallel=True)
def conv_numba_opt(img_in):
    multiplier = np.iinfo(np.uint8).max / np.iinfo(np.uint16).max
    shape=img_in.shape

    img=img_in.reshape(-1)
    img_out=np.empty(img.shape,dtype=np.uint8)

    for i in nb.prange(img.shape[0]):
        img_out[i]=img[i]*multiplier
    return img_out.reshape(shape)

def conv_numpy(img):
    np.multiply(img, multiplier, out=img, casting="unsafe")
    img = img.astype(np.uint8, order="C")
    return img

타이밍

img = np.ones((29630, 6081, 3), dtype=np.uint16)

%timeit res_1=conv_numpy(img)
#990 ms ± 2.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit res_2=conv_numba(img)
#with parallel=True
#122 ms ± 17.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#with parallel=False
#571 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

정수 배열에 Float를 곱하면 Julia에서 Float 배열을 생성하는 것과 비교하여 성능이 증가하거나 감소합니까?

분류에서Dev

Python : float 정밀도로 파일에 Numpy 배열 쓰기

분류에서Dev

"TypeError : 정수 스칼라 배열 만 스칼라 인덱스로 변환 될 수 있습니다."float를 배열의 값과 비교할 때

분류에서Dev

텍스트 파일에서 float 값이있는 numpy 배열로 읽기

분류에서Dev

TypeError : dtyped [float64] 배열과 [bool] 유형의 스칼라로 'rand_'를 수행 할 수 없습니다.

분류에서Dev

float를 numpy 배열로 오버로드

분류에서Dev

numpy 배열에 float 좌표 추가

분류에서Dev

C ++ float를 분수로 곱하기

분류에서Dev

TypeError : 내가하지 않았음에도 불구하고 'numpy.float64'유형의 비 정수로 시퀀스를 곱할 수 없습니다.

분류에서Dev

ValueError : 문자열을 float로 변환 할 수 없습니다 : Numpy 배열

분류에서Dev

C의 함수에 매개 변수로 float 배열과 float를 전달하는 방법

분류에서Dev

배열 입력이있는 사용자 지정 함수 : 오류 : | float를 float로 캐스팅 할 수 없습니다 * | 캐스트없이

분류에서Dev

float를 문자열로 변환 numba python numpy 배열

분류에서Dev

float 배열에서 mpf_set_ui를 사용하면 출력이 중지됩니다 (GMP C ++).

분류에서Dev

float 배열에서 mpf_set_ui를 사용하면 출력이 중지됩니다 (GMP C ++).

분류에서Dev

float64 numpy 배열을 과학적 표기법이 아닌 부동 소수점으로 변환

분류에서Dev

float로 numpy 배열의 값 복사

분류에서Dev

초기화에서 float float를 float로 변환 할 수 없습니다.

분류에서Dev

cut 함수 : 'safe'규칙에 따라 dtype ( 'float64')에서 dtype ( '<U32')으로 배열 데이터를 캐스팅 할 수 없습니다.

분류에서Dev

MemoryError : python에서 word2vec를 사용하는 동안 모양 및 데이터 유형 float32로 배열을 할당 할 수 없습니다.

분류에서Dev

배열을 상수로 나눈 후 numpy 배열에서 float의 자동 반올림을 변경하는 방법은 무엇입니까?

분류에서Dev

스칼라를 Numpy 배열과 비교

분류에서Dev

'safe'에 따라 dtype ( 'float64')에서 dtype ( 'int32')로 배열 데이터를 캐스팅 할 수 없습니다.

분류에서Dev

파이썬의 함수에 부동 숫자를 곱하고 얻는 것은 'float'유형의 비 정수로 시퀀스를 곱할 수 없습니다.

분류에서Dev

TypeError : 길이 1 배열 만 numpy 배열을 사용하여 Python 스칼라로 변환 할 수 있습니다.

분류에서Dev

float4를 float 배열 opencl에 할당

분류에서Dev

해시 테이블에서 Float 배열을 검색 할 수 없습니다.

분류에서Dev

python gensim : 인덱스 배열에 정수가 아닌 dtype (float64)이 있습니다.

분류에서Dev

2 차원 배열에서 float 값을 가진 배열 찾기

Related 관련 기사

  1. 1

    정수 배열에 Float를 곱하면 Julia에서 Float 배열을 생성하는 것과 비교하여 성능이 증가하거나 감소합니까?

  2. 2

    Python : float 정밀도로 파일에 Numpy 배열 쓰기

  3. 3

    "TypeError : 정수 스칼라 배열 만 스칼라 인덱스로 변환 될 수 있습니다."float를 배열의 값과 비교할 때

  4. 4

    텍스트 파일에서 float 값이있는 numpy 배열로 읽기

  5. 5

    TypeError : dtyped [float64] 배열과 [bool] 유형의 스칼라로 'rand_'를 수행 할 수 없습니다.

  6. 6

    float를 numpy 배열로 오버로드

  7. 7

    numpy 배열에 float 좌표 추가

  8. 8

    C ++ float를 분수로 곱하기

  9. 9

    TypeError : 내가하지 않았음에도 불구하고 'numpy.float64'유형의 비 정수로 시퀀스를 곱할 수 없습니다.

  10. 10

    ValueError : 문자열을 float로 변환 할 수 없습니다 : Numpy 배열

  11. 11

    C의 함수에 매개 변수로 float 배열과 float를 전달하는 방법

  12. 12

    배열 입력이있는 사용자 지정 함수 : 오류 : | float를 float로 캐스팅 할 수 없습니다 * | 캐스트없이

  13. 13

    float를 문자열로 변환 numba python numpy 배열

  14. 14

    float 배열에서 mpf_set_ui를 사용하면 출력이 중지됩니다 (GMP C ++).

  15. 15

    float 배열에서 mpf_set_ui를 사용하면 출력이 중지됩니다 (GMP C ++).

  16. 16

    float64 numpy 배열을 과학적 표기법이 아닌 부동 소수점으로 변환

  17. 17

    float로 numpy 배열의 값 복사

  18. 18

    초기화에서 float float를 float로 변환 할 수 없습니다.

  19. 19

    cut 함수 : 'safe'규칙에 따라 dtype ( 'float64')에서 dtype ( '<U32')으로 배열 데이터를 캐스팅 할 수 없습니다.

  20. 20

    MemoryError : python에서 word2vec를 사용하는 동안 모양 및 데이터 유형 float32로 배열을 할당 할 수 없습니다.

  21. 21

    배열을 상수로 나눈 후 numpy 배열에서 float의 자동 반올림을 변경하는 방법은 무엇입니까?

  22. 22

    스칼라를 Numpy 배열과 비교

  23. 23

    'safe'에 따라 dtype ( 'float64')에서 dtype ( 'int32')로 배열 데이터를 캐스팅 할 수 없습니다.

  24. 24

    파이썬의 함수에 부동 숫자를 곱하고 얻는 것은 'float'유형의 비 정수로 시퀀스를 곱할 수 없습니다.

  25. 25

    TypeError : 길이 1 배열 만 numpy 배열을 사용하여 Python 스칼라로 변환 할 수 있습니다.

  26. 26

    float4를 float 배열 opencl에 할당

  27. 27

    해시 테이블에서 Float 배열을 검색 할 수 없습니다.

  28. 28

    python gensim : 인덱스 배열에 정수가 아닌 dtype (float64)이 있습니다.

  29. 29

    2 차원 배열에서 float 값을 가진 배열 찾기

뜨겁다태그

보관