Как удалить «None» из добавленного многомерного массива с помощью numpy - PullRequest
1 голос
/ 06 августа 2010

Мне нужно взять 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)

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

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 с моими данными?

Ответы [ 4 ]

1 голос
/ 07 августа 2010

@ Ответ Гнибблера технически корректен, но нет никаких оснований для создания исходного массива 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 голос
/ 06 августа 2010

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

storecoeffs = numpy.empty((5,0), dtype='object')
1 голос
/ 06 августа 2010

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

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

, если я правильно понял ваш вопрос.

1 голос
/ 06 августа 2010

Почему вы выделяете целый массив None с и добавляете к нему?Разве coeffsarray - это не тот массив, который вам нужен?Используйте numpy.reshape.

import numpy
coeffsarray = numpy.reshape( coeffsarray, ( 5, 11 ) )
...