Как хранить результаты цикла for в виде массива? - PullRequest
1 голос
/ 26 июня 2019

Мне нужно сгенерировать список случайных чисел, прежде чем выполнять с ними функцию, и сохранить исходное случайное число и результат в виде кортежа в массиве.

# Here is how I'm generating my random integers
celsius = random.sample (range(-10, 40), 35)
print (celsius)

# This is how I store them as an array
array = numpy.array(celsius)
print(celsius)

# This is how I am trying to list my pairs in an array
for n in celsius:
    f = (float(n * 1.8 + 32))
    pairs = (n, f)
    numpy.array(pairs)
    print(pairs)

Я получаю списокпар, но когда я печатаю снова, он печатает последнюю пару, а не весь список.Кроме того, длина указывается как две, когда я проверяю.

В идеале эти пары должны быть кортежами в массиве.Любая помощь с благодарностью!

Ответы [ 4 ]

3 голосов
/ 26 июня 2019

Вот как бы я это сделал:

import numpy as np

# isolate the wisdom related to the conversion in a function
def celsius2fahrenheit(x):
    return (x * 1.8 + 32)

# generate random values
celsius_arr = np.random.randint(-10, 40, 35)

# compute the converted values
fahrenheit_arr = celsius2fahrenheit(celsius_arr)

# stack them together
pairs_arr = np.stack([celsius_arr, fahrenheit_arr])

Выполнение этого с явным циклом даст вам неоптимальные характеристики с массивами NumPy, особенно если вы не выделяете память заранее.

Однако, просто чтобы проиллюстрировать, как это можно сделать:

import numpy as np

# same as before
def celsius2fahrenheit(x):
    return (x * 1.8 + 32)

# allocate the memory
pair_arr = np.zeros(2, 35)
for i in range(35):
    # generate a random number
    x = np.random.randint(-10, 40)
    # store its value and the converted value
    pair_arr[:, i] = x, celsius2fahrenheit(x)

Наконец, вы можете использовать простые Python list s, которые являются более подходящим контейнером для динамически растущих последовательностей:

import random

# same as before
def celsius2fahrenheit(x):
    return (x * 1.8 + 32)

# Option 1: all in a single loop
pairs = []
for _ in range(35):
    x = random.randint(-10, 40)
    pairs.append([x, celsius2fahrenheit(x)])

# Option 2: create two lists to join later
celsius_values = [random.randint(-10, 40) for _ in range(35)]
fahrenheit_values = [celsius2fahrenheit(x) for x in celsius_values]
pair_values = list(zip(celsius_values, fahrenheit_values))
0 голосов
/ 26 июня 2019

Так как это не упоминается, простой способ понимания списка:

import numpy as np
import random

celsius = np.array(random.sample(range(-10, 40), 35))

def g(i):
    return float(i * 1.8 + 32)

np.array([(i, g(i)) for i in celsius])
array([[ 27. ,  80.6],
       [ 19. ,  66.2],
       [ 34. ,  93.2],
       [ 39. , 102.2],
       [ 38. , 100.4],
       [  9. ,  48.2],
       [ 25. ,  77. ],
       [ 14. ,  57.2],
       [ 12. ,  53.6],
       [  3. ,  37.4],
       [ -8. ,  17.6],
       [ 16. ,  60.8],
       [ 17. ,  62.6],
       [ 32. ,  89.6],
       [ 35. ,  95. ],
       [  8. ,  46.4],
       [ 33. ,  91.4],
       [ 10. ,  50. ],
       [ 15. ,  59. ],
       [ 18. ,  64.4],
       [ 36. ,  96.8],
       [ 26. ,  78.8],
       [ -6. ,  21.2],
       [ 29. ,  84.2],
       [  5. ,  41. ],
       [ -1. ,  30.2],
       [  6. ,  42.8],
       [ -5. ,  23. ],
       [ 30. ,  86. ],
       [-10. ,  14. ],
       [ -2. ,  28.4],
       [ 31. ,  87.8],
       [ -3. ,  26.6],
       [  7. ,  44.6],
       [  2. ,  35.6]])
0 голосов
/ 26 июня 2019

Я считаю, что вы хотите сделать:

#get our list of random celcius numbers
celsius = random.sample (range(-10, 40), 35)
#create an empty list to use later
list = []
#for each element in the list of celcius numbers
for c in celsius:
   #get a farenheit value
   f = float(c*1.8+32)
   #add a sublist consisting of the celsius and fahrenheit numbers to our list
   list += [[c, f]]
#convert the list to a numpy array
array = numpy.array(list)
0 голосов
/ 26 июня 2019

Вам нужно добавить каждый результат «пар» в пустой массив / список, вот как я бы это сделал;

celsius = random.sample(range(-10, 40), 35)

array = numpy.array(celsius)

final_list = []
for n in celsius:
    f = (float(n * 1.8 + 32))
    pairs = [n, f]
    final_list.append(pairs)

print(final_list)

Это дает мне вывод, подобный этому - [[0, 32.0], [10, 50,0], [11, 51,8], ...]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...