Мне нужно взять CSV-файл и импортировать эти данные в многомерный массив в Python, но я не уверен, как убрать значения None из массива после того, как я добавил свои данные в пустой массив.

Сначала я создал такую структуру:

storecoeffs = numpy.empty((5,11), dtype='object')

Это возвращает массив из 5 строк на 11 столбцов, заполненный None.

Затем я открыл свой CSV-файл и преобразовал его в массив:

coeffsarray = list(csv.reader(open("file.csv")))

coeffsarray = numpy.array(coeffsarray, dtype='object')

Затем я добавил два массива:

newmatrix = numpy.append(storecoeffs, coeffsarray, axis=1)

В результате получается массив, заполненный значениями «Нет», за которыми следуют данные, которые я хочу (первые две строки показаны, чтобы дать вам представление о природе моих данных):

array([[None, None, None, None, None, None, None, None, None, None, None,
    workers, constant, hhsize, inc1, inc2, inc3, inc4, age1, age2,
    age3, age4],[None, None, None, None, None, None, None, None, None, None, None,
    w0, 7.334, -1.406, 2.823, 2.025, 0.5145, 0, -4.936, -5.054, -2.8, 0],,...]], dtype=object)

Как мне удалить эти «None» объекты из каждой строки, так что мне остается многомерный массив 5 x11 с моими данными?

1
myClone 6 Авг 2010 в 23:22

4 ответа

Лучший ответ

Ответ @ Гнибблера технически верен, но нет никаких оснований для создания исходного массива storecoeffs. Просто загрузите ваши значения, а затем создайте массив из них. Однако, как заметил @Mermoz, ваш вариант использования выглядит достаточно простым для numpy.loadtxt ().

Кроме того, почему вы используете массив объектов? Это, вероятно, не то, что вы хотите ... Сейчас вы храните числовые значения в виде строк, а не с плавающей точкой!

По сути, у вас есть два способа обрабатывать ваши данные в клочья. Если вы хотите легкий доступ к именованным столбцам, используйте структурированный массив (или массив записей). Если вы хотите иметь «нормальный» многомерный массив, просто используйте массив чисел с плавающей запятой, целых и т. Д. У объектных массивов есть определенное назначение, но, вероятно, это не то, что вы делаете.

Например: просто загрузить данные в виде обычного двумерного массива (при условии, что все ваши данные могут быть легко представлены в виде числа с плавающей запятой):

import numpy as np
# Note that this ignores your column names, and attempts to 
# convert all values to a float...
data = np.loadtxt('input_filename.txt', delimiter=',', skiprows=1)

# Access the first column 
workers = data[:,0]

Чтобы загрузить ваши данные в виде структурированного массива, вы можете сделать что-то вроде этого:

import numpy as np
infile = file('input_filename.txt')

# Read in the names of the columns from the first row...
names = infile.next().strip().split()

# Make a dtype from these names...
dtype = {'names':names, 'formats':len(names)*[np.float]}

# Read the data in...
data = np.loadtxt(infile, dtype=dtype, delimiter=',')

# Note that data is now effectively 1-dimensional. To access a column,
# index it by name
workers = data['workers']

# Note that this is now one-dimensional... You can't treat it like a 2D array
data[1:10, 3:5] # <-- Raises an error!

data[1:10][['inc1', 'inc2']] # <-- Effectively the same thing, but works..

Если у вас есть нечисловые значения в ваших данных и вы хотите обрабатывать их как строки, вам нужно использовать структурированный массив, указать, какие поля должны быть строками, и установить максимальную длину для строк в поле.

Исходя из ваших примеров данных, это выглядит как первый столбец, «работники» - это не числовое значение, которое вы можете сохранить в виде строки, а все остальные выглядят как числа с плавающей запятой. В этом случае вы бы сделали что-то вроде этого:

import numpy as np
infile = file('input_filename.txt')
names = infile.next().strip().split()

# Create the dtype... The 'S10' indicates a string field with a length of 10
dtype = {'names':names, 'formats':['S10'] + (len(names) - 1)*[np.float]}
data = np.loadtxt(infile, dtype=dtype, delimiter=',')

# The "workers" field is now a string array
print data['workers']

# Compare this to the other fields
print data['constant']

Если есть случаи, когда вам действительно нужна гибкость модуля csv (например, текстовые поля с запятыми), вы можете использовать его для чтения данных, а затем преобразовать его в структурированный массив с соответствующим dtype.

Надеюсь, это прояснит ситуацию ...

1
Joe Kington 6 Авг 2010 в 20:21

Почему бы просто не использовать numpy.loadtxt ():

newmatrix = numpy.loadtxt("file.csv", dtype='object') 

Должен делать работу, если я правильно понял, что вы вопрос.

1
Mermoz 6 Авг 2010 в 21:06

Начать с пустого массива?

storecoeffs = numpy.empty((5,0), dtype='object')
1
John La Rooy 6 Авг 2010 в 19:31

Почему вы выделяете целый массив None и добавляете к этому? coeffsarray не тот массив, который вам нужен?

Редактировать

Ой. Используйте numpy.reshape.

import numpy
coeffsarray = numpy.reshape( coeffsarray, ( 5, 11 ) )
1
Katriel 6 Авг 2010 в 20:22