Pertanyaan Fungsi Python setara dengan R `pretty ()`?


Saya mereplikasi beberapa kode R dengan Python.

Saya sudah tersandung pada R's pretty().

Yang saya butuhkan adalah pretty(x), dimana x beberapa angka.

Kira-kira, fungsi "menghitung breakpoint yang cukup" sebagai urutan beberapa nilai "bulat". Saya tidak yakin ada persamaan Python dan saya tidak terlalu beruntung dengan Google.

Edit: Lebih khusus, ini adalah entri Deskripsi di laman bantuannya pretty:

Deskripsi: Hitung urutan sekitar n + 1 nilai 'putaran' yang sama yang mencakup rentang nilai dalam x. Nilai-nilai dipilih sehingga mereka 1, 2 atau 5 kali kekuatan 10.

Saya melihat ke R's pretty.default() untuk melihat apa sebenarnya yang R lakukan dengan fungsi tetapi akhirnya menggunakan .Internal() - yang biasanya mengarah ke sihir R gelap. Saya pikir saya akan bertanya-tanya sebelum menyelam.

Apakah ada yang tahu jika Python memiliki sesuatu yang setara dengan R's pretty()?


6
2018-03-28 17:00


asal


Jawaban:


Saya berpikir bahwa psuedocode diposting oleh Lewis Fogden tampak akrab, dan kami memang pernah dikodekan pseudocode di C + + untuk rutin merencanakan (untuk menentukan cantik label sumbu). Saya segera menerjemahkannya ke Python, tidak yakin apakah ini mirip dengan pretty() di R, tapi saya harap itu membantu atau berguna bagi siapa saja ..

import numpy as np

def nicenumber(x, round):
    exp = np.floor(np.log10(x))
    f   = x / 10**exp

    if round:
        if f < 1.5:
            nf = 1.
        elif f < 3.:
            nf = 2.
        elif f < 7.:
            nf = 5.
        else:
            nf = 10.
    else:
        if f <= 1.:
            nf = 1.
        elif f <= 2.:
            nf = 2.
        elif f <= 5.:
            nf = 5.
        else:
            nf = 10.

    return nf * 10.**exp

def pretty(low, high, n):
    range = nicenumber(high - low, False)
    d     = nicenumber(range / (n-1), True)
    miny  = np.floor(low  / d) * d
    maxy  = np.ceil (high / d) * d
    return np.arange(miny, maxy+0.5*d, d)

Ini menghasilkan misalnya:

pretty(0.5, 2.56, 10)
pretty(0.5, 25.6, 10)
pretty(0.5, 256, 10 )
pretty(0.5, 2560, 10)

[0,5 1. 1,5 2. 2,5 3.]

[0. 5. 10. 15. 20. 25. 30.]

[0. 50. 100. 150. 200. 250. 300.]

[0. 500. 1000. 1500. 2000. 2500. 3000.]


6
2018-06-06 17:54



Tidak semudah itu R tetapi Anda masih bisa menggunakan numpy:

import numpy as np
np.linspace(a,b,n,dtype=int)

dimana a adalah awal dari jangkauan, b adalah akhir dan n adalah jumlah nilai, sedangkan tipe outputnya int.

Sebagai contoh:

np.linspace(0,10,11,dtype=int)

array ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

Tentu saja jika Anda ingin lebih elegan Anda bisa membungkusnya:

pretty = lambda x: np.linspace(0,x,11,dtype=int)
pretty(10)

2
2018-06-05 14:17



Bagaimana dengan numpy.arange?

import numpy as np

print np.arange(0,16,3)

$ [0 3 6 9 12 15]


0
2018-06-05 20:16