在numpy_数组Python中添加列

2024-09-29 00:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中使用了一个numpy数组,我想知道如何在数组的末尾添加一个新的column?在

我有一个包含N行的数组,并为每一行计算一个新值,该值名为X。我希望,对于每一行,在一个新列中添加这个新值。在

我的脚本是(有趣的部分在我的脚本末尾):

#!/usr/bin/python
# coding: utf-8

from astropy.io import fits
import numpy as np
#import matplotlib.pyplot as plt
import math


        #########################################
        # Fichier contenant la liste des champs #
        #########################################


with open("liste_essai.txt", "r") as f :

    fichier_entier = f.read()
    files = fichier_entier.split("\n")

for fichier in files :

    with open(fichier, 'r') :

        reading = fits.open(fichier)          # Ouverture du fichier à l'aide d'astropy

        tbdata = reading[1].data               # Lecture des données fits


        #######################################################
        # Application du tri en fonction de divers paramètres #
        #######################################################

        #mask1 = tbdata['CHI'] < 1.0        # Création d'un masque pour la condition CHI
        #tbdata_temp1 = tbdata[mask1]

        #print "Tri effectué sur CHI"

        #mask2 = tbdata_temp1['PROB'] > 0.01    # Création d'un second masque sur la condition PROB
        #tbdata_temp2 = tbdata_temp1[mask2]

        #print "Tri effectué sur PROB"

        #mask3 = tbdata_temp2['SHARP'] > -0.4   # Création d'un 3e masque sur la condition SHARP (1/2)
        #tbdata_temp3 = tbdata_temp2[mask3]

        #mask4 = tbdata_temp3['SHARP'] < 0.1    # Création d'un 4e masque sur la condition SHARP (2/2)
        #tbdata_final = tbdata_temp3[mask4]

        #print "Création de la nouvelle table finale"
        #print tbdata_final         # Affichage de la table après toutes les conditions

        #fig = plt.figure()
        #plt.plot(tbdata_final['G'] - tbdata_final['R'], tbdata_final['G'], '.')
        #plt.title('Diagramme Couleur-Magnitude')
        #plt.xlabel('(g-r)')
        #plt.ylabel('g')
        #plt.xlim(-2,2)
        #plt.ylim(15,26)
        #plt.gca().invert_yaxis()
        #plt.show()
        #fig.savefig()

        #print "Création du Diagramme"

        #hdu = fits.BinTableHDU(data=tbdata_final)
        #hdu.writeto('{}_{}'.format(fichier,'traité'))      # Ecriture du résultat obtenu dans un nouveau fichier fits

        #print "Ecriture du nouveau fichier traité"

        #################################################
        # Détermination des valeurs extremales du champ #
        #################################################

        RA_max = np.max(tbdata['RA'])
        RA_min = np.min(tbdata['RA'])
        #print "RA_max vaut :     " + str(RA_max)
        #print "RA_min vaut :     " + str(RA_min)

        DEC_max = np.max(tbdata['DEC'])
        DEC_min = np.min(tbdata['DEC'])
        #print "DEC_max vaut :   " + str(DEC_max)
        #print "DEC_min vaut :   " + str(DEC_min)

        #########################################
        # Calcul de la valeur centrale du champ #
        #########################################

        RA_central = (RA_max + RA_min)/2.
        DEC_central = (DEC_max + DEC_min)/2.

        #print "RA_central vaut : " + str(RA_central)
        #print "DEC_central vaut : " + str(DEC_central)

        print " "
        print " ######################################### "

    ##############################
    # Détermination de X et de Y #
    ##############################

        i = 0
        N = len(tbdata)

        for i in range(0,N) :

            print "Valeur de RA à la ligne " + str(i) + " est : " + str(tbdata['RA'][i])
            print "Valeur de RA_moyen est : " + str(RA_central)
            print "Valeur de DEC_moyen est : " + str(DEC_central)

            X = (tbdata['RA'][i] - RA_central)*math.cos(DEC_central)

            Add_column = np.vstack(tbdata, X) # ==> ????

            print "La valeur de X est : " + str(X)
            print " "

我试过一些方法,但我不确定是否有效。在

我还有第二个问题,如果可能的话。在打印部分,我想保存每个文件的打印,但要有每个文件的名称。我想我需要写一些东西,比如:

^{pr2}$

Tags: npdepltminlamaxdeccr
1条回答
网友
1楼 · 发布于 2024-09-29 00:11:43

Numpy数组总是存储在一个连续的内存块中,这意味着一旦创建了Numpy数组,使其更大,就意味着Numpy必须复制原始数组,以确保加法位于内存中原始数组的旁边。
如果您对要添加的列数有一个大致的概念,那么可以使用附加的零列来创建原始数组。这将为数组保留内存空间,然后您可以通过覆盖最左边的零列来“添加”列。
如果你有足够的内存,你总是可以高估你需要的列数,然后在以后删除多余的零列。据我所知,这是在向numpy数组添加新列时避免复制的唯一方法。在

例如:

my_array = np.random.rand(200,3)  # the original array
zeros = np.zeros((200,400))   # anticipates 400 additional columns

my_array = np.hstack((my_array,zeros)) # join my_array with the array of zeros (only this step will make a copy)

current_column = 3  # keeps track of left most column of zeros

new_columns = []  # put list of new columns to add here 

for col in new_columns:
    my_array[:,current_column] = col
    current_column += 1 

相关问题 更多 >