2015-03-04 12 views
8

Bir sayısal diziyi diğeriyle dizinlemek - her ikisi de dtype = 'uint32' olarak tanımlanır. İndekslemek ve güvenli olmayan bir döküm hatası almak için numpy.take öğesini kullanın. Daha önce buna rastlamadım. Neler olup bittiği hakkında bir fikrin var mı?Nümerik dizi dökümü 'güvenli değil' olarak ayarlanmış

Python 2.7.8 |Anaconda 2.1.0 (32-bit)| (default, Jul 2 2014, 15:13:35) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 

>>> import numpy 
>>> numpy.__version__ 
'1.9.0' 

>>> a = numpy.array([9, 7, 5, 4, 3, 1], dtype=numpy.uint32) 
>>> b = numpy.array([1, 3], dtype=numpy.uint32) 
>>> c = a.take(b) 

Traceback (most recent call last): 
    File "<pyshell#12>", line 1, in <module> 
    c = a.take(b) 
TypeError: Cannot cast array data from dtype('uint32') to dtype('int32') according to the rule 'safe' 
+0

Uyarı python'unu çalıştırmayla ilgili uyarı alamıyorum 3.4.3 64 bit ve numpy '1.9.2rc1' – EdChum

+0

Sanırım sorun a.take (b) 'a' c' a atamadır. C = a.take (b) 'den önce c = numpy.array (0, dtype = numpy.uint32)' yi ayarlamayı deneyin. –

+0

Python 2.7.5 64-bit ve numpy 1.9.1 ile burada uyarı yok. – Carsten

cevap

7

(sadece take örneğin here için bakınız değil) belirtilmesi dizinleri veya uzunluklarını gerektirir NumPy fonksiyonları çalışırken bu oldukça yaygındır.

sorun indeksleme amaçlı NumPy (np.intp muhtemelen 32 bit sistemde "işaretçi" tamsayı tipidir) bir int32 dizi olarak sizin uint32 dizi tedavi etmek istiyorum, yani ve bunu aşağı atmak istiyor bu tip.

Bunu güvenli bir şekilde yapamaz - işaretsiz bir dizideki bazı tamsayılar, işaretli 32 bit tam sayı olarak gösterilmeyebilir. Gördüğünüz hata bunu yansıtır.

Bu b d_type int64 veya şamandıra d_type varsa sen ancak o int32 veya daha küçük bir tamsayı d_type bile, aynı hatayı alırsınız anlamına gelir.

Değeri için, bu, güvenli olmayan döküm işlemine izin veren a[b] dizinleme gösterimi için hemen bir sorun değildir (ancak dizin sınırlar dışında ise bir hata oluşturur). Örneğin a[2**31] - NumPy, int32'a atıf yapar ancak -2147483648 dizininin sınırlar dışında kalmasından şikayetçidir.

+0

Teşekkürler! Normalde bir [b] kullanıyorum ama bunun daha yavaş olması gerekiyor. Her neyse, işe yaramaz! –

+0

Artık 1.9.x'de daha yavaş değil. Ve bu davranış muhtemelen bir hata olarak raporlanmalıdır, 'np.take' indekslemenin yaptığıyla aynı şeyi yapmalıdır: indeksin bir tamsayı olduğunu doğruladıktan sonra güvenli olmayan döküm kullanın, örn. 32 bitlik bir sistemde [2 ** 32-1] '' [-1] 'i döndürür, çünkü '' 2 ** 32-1'' bir 'np.uint32'ye dönüştürülür; a np.int32. Bu köşe davası buggy davranışı, np.uint32'nin bir indeks olarak kullanılamaz hale getirilmesinden daha az rahatsız edici. – Jaime

+0

@Jaime Bir [b] tür indekslemenin artık yavaş olduğunu duymak güzel. Np.take ile ilgili numpy posta listesine bir not düşeceğim. Teşekkürler! –