Dicas para jogar golfe com numpy, scipy ou pylab

10

Já existe uma lista abrangente de dicas para python aqui , então o que eu estou pedindo são dicas que se aplicam especificamente a usar os numpy, scipyou pylabbibliotecas.

Podem ser maneiras de reduzir o código que já está sendo usado numpyou maneiras de reduzir operações comuns em python usando essas bibliotecas.

Uma dica por resposta, por favor.

user2699
fonte
Observe que pylabé apenas matplotlib.pyplot+ numpyem um espaço para nome comum descontinuado. A numpyparte de pylabé trivial no sentido de que suas importações têm o mesmo número de bytes; portanto, somente material de plotagem pode vir adicionalmente pylab, mas suspeito que não é isso que você tinha em mente com sua pergunta.
Andras Deak 24/02
2
@AndrasDeak, estou ciente de que o uso do pylab é considerado uma prática ruim, mas muito pouco no codegolf pode ser considerado uma boa prática. O Pylab inclui diretamente partes de muitos numpypacotes. Por exemplo, pylab.randinté válido onde numpy exigiria numpy.random.randint. Portanto, para o golfe pylabdeve fornecer um código mais curto.
user2699
11
Estou ciente de que a reprovação não é um problema, o que quero dizer é que ela também não oferece uma vantagem. Simplesmente não sabia que subpacotes também eram carregados no espaço de nomes do pylab assim! Desculpe, você está perfeitamente certo :)
Andras Deak 24/02

Respostas:

5

Faça uso da transmissão do Numpy

Difusão significa replicar uma matriz multidimensional ao longo de algumas de suas dimensões singleton para corresponder ao tamanho de outra matriz. Isso acontece automaticamente para matrizes Numpy quando operadores aritméticos são aplicados a eles.

Por exemplo, para gerar uma tabela de multiplicação 10 × 10, você pode usar

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

Experimente online!

Aqui té criado como o array Numpy [1, 2, ..., 10]. Isso tem forma (10), que é equivalente a (1,10). A outra matriz de operandos,, t[:,None]tem tamanho (10,1). A multiplicação das duas matrizes as replica implicitamente, para que elas se comportem como se tivessem forma (10,10). O resultado, que também possui formato (10,10), contém os produtos para todos os pares de entradas nas matrizes originais.

Luis Mendo
fonte
Esse foi um uso inteligente da ziptransmissão, isso vai aparecer na sua própria resposta?
user2699
@ user2699 Não acho que valha uma resposta separada, porque [*zip(t)]tem a mesma contagem de bytes que a mais legível t[:,None]. Mas você está certo, pode ser interessante notar, então eu adicionei-lo de volta aqui
Luis Mendo
Bom ponto, acho que não contei os bytes. [*zip(t)]seria dois bytes mais curto se houvesse mais dimensões.
user2699
11
Nota que se estendeu descompactação iterable em [*zip(t)]só irá funcionar em python 3.
Andras Deak
Eu vi esta página como estou interessado em descobrir o que é um numpy que o Perl 6 não. De qualquer forma que seria escrito como my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]ou você poderia usarzip(t)
Brad Gilbert b2gills
2

Use r _ [...] em vez de intervalo (...)

Numpy fornece matlab como sintaxe para criação de array usando r_[...]. Qualquer notação de fatia entre parênteses é interpretada como uma matriz com o intervalo indicado. Então, por exemplo

r_[:30:4]

é equivalente a

arange(0,30,4)

e para a maioria dos usos pode substituir

range(0,30 4)

Ele também pode lidar com expressões mais complexas. Por exemplo, para obter índices de 0 a 10 e voltar novamente,

r_[:10,10:-1:-1]
user2699
fonte