2016-04-11 17 views
3

Değerleri tanımlamak için satır ve sütunun bir işlevini belirterek numpy ndarray oluşturmak istiyorum.Nümerik bir ndarray'ı her satırda ve sütunda çağrılan bir işlevle nasıl verimli bir şekilde doldurabilirim?

Örneğin, böyle bir şey yapabilmek istiyorum (tamamen yanlış sözdizimi, ama fikir almalısınız):

>>> np.ndarray((2,3), lambda r,c: 3*r+c) 
[[ 0 1 2] 
[ 3 4 5]] 

çevrimiçi arama yaşadım gerçi, hiçbir şey vermiştir sorun ... bunun aramak için tam olarak nasıl şu anda var

(eşdeğer) aşağıdaki kod düşünme, ama korkunç verimsiz:

Maalesef
def ndarrayFuncFill(size, func): 
    z = np.empty(size) 
    for r in np.arange(size[0]): 
     for c in np.arange(size[1]): 
      z[r][c] = func(r,c) 
    return z 

>>> ndarrayFuncFill((2,3), lambda r,c: 3*r+c) 
array([[ 0., 1., 2.], 
     [ 3., 4., 5.]]) 

, özellikle bunu şu anda kullanmak istediğim işlev, ufak bir şekilde ya da bunun gibi bir şey olarak kolayca yeniden yazabileceğim bir şey değildir. Bunu kara kutu olarak görmek zorundayım.

Aslında bunu (yukarıdaki lambda kadar basit bir şeyle değil) ile kullanmakla ilgilendiğim işlev, yayınlama iznim yok. Ancak, esas olarak bir arama tablosunda enterpolasyon yapar. Yani bir satır ve sütun verirsiniz ve bunu bir arama tablosundaki endekslere çevirirsiniz - ancak sadece bire bir arama olmadığı bazı zor şeyler vardır, bazen 'yakın' bir arada değerler ve bu tür şeyler. Yani, bu en verimli fonksiyon değil, ama iç içe geçmiş döngüler gibi çok fazla miktarda saçma atık kaynağım olmamasını tercih ediyorum.

Herhangi bir öneriniz var mı?

+0

neden bu kadar biz onu (ya basitleştirilmiş örnek görebilirsiniz işlevini katmayan)? Ayrıca [mcve] 'ye bir göz atın. – roadrunner66

+0

Maalesef tam kodu yayınlama iznim yok, ancak soru bildirimine daha fazla bilgi ekleyeceğim. Tavsiye için teşekkür ederim! –

+0

'lookup' olarak belirttiğiniz düzenlemeye bağlı olarak,' np.searchsorted' kullanabilirsiniz. İlgili kullanım durumları için Stackoverflow aracılığıyla arama yapmaktan çekinmeyin: http://stackoverflow.com/search?q=%5Bnumpy%5D+np.searchsorted – Divakar

cevap

0

Örneğiniz için en hızlı çözüm, np.arange(6).reshape(3, 2). Genelde 1D dizileri için np.vectorize'u kullanabilir ve gerekirse yeniden şekillendirebilirsiniz, ancak bu optimize edilmemiştir ("Uygulama aslında bir döngüdür.").

+0

Yani bir şey kaçırmadığı sürece (belki 1D yeniden şekillendirme ile 2B'den çok daha hızlı mı?) gerçekten yukarıda kullandığım örnekte gerçekten ele alınıyor gibi görünüyorsun. Maalesef, sadece bir örnek. Ama yine de teşekkürler! –

+2

'np.vectorize', zaman tasarrufu için yeterli değildir. – hpaulj

+0

@hpaulj Anlaşmalı. –

1

index arrays kullanmayı deneyebilirsiniz. Eğer böyle bir şey yapabileceğini np.indices kullanarak basit Örneğin : Yani

import numpy as np 
r, c = 2, 3 
a = np.empty((r, c)) 
b = np.indices((r, c)) 
a[b[0], b[1]] = 3 * b[0] + b[1] 

sonra elimizdeki:

>>> a 
array([[ 0., 1., 2.], 
     [ 3., 4., 5.]]) 
İlgili konular