Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建二进制完整性映射_Python_Numpy_Matplotlib - Fatal编程技术网

Python 创建二进制完整性映射

Python 创建二进制完整性映射,python,numpy,matplotlib,Python,Numpy,Matplotlib,我触及了我项目的目标,但我遇到了一个问题:如何创建完整性图? 我有很多数据,一个可能有500.000个对象的字段,这些对象在我的绘图中以不同的缩放比例用点表示: 我想创建一个遮罩,我的意思是,将我的绘图切割成微小的像素,然后说如果我在这个像素中有一个对象,我得到的值是:1(例如黑色)elif,我在我的像素中没有对象,我得到的值是:0(例如白色) 我将创建一个遮罩,我可以用这个遮罩分割每个字段。 问题是我不知道如何处理才能做到:/ 我创建了第一个脚本,以便对数据进行选择。这个: #!/usr/

我触及了我项目的目标,但我遇到了一个问题:如何创建完整性图? 我有很多数据,一个可能有500.000个对象的字段,这些对象在我的绘图中以不同的缩放比例用点表示:

我想创建一个遮罩,我的意思是,将我的绘图切割成微小的像素,然后说如果我在这个像素中有一个对象,我得到的值是:1(例如黑色)elif,我在我的像素中没有对象,我得到的值是:0(例如白色)

我将创建一个遮罩,我可以用这个遮罩分割每个字段。 问题是我不知道如何处理才能做到:/

我创建了第一个脚本,以便对数据进行选择。这个:

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

from astropy.io import fits
from astropy.table import Table
import numpy as np
import matplotlib.pyplot as plt

                ###################################
                # Fichier contenant le champ brut #
                ###################################

filename = '/home/valentin/Desktop/Field52_combined_final_roughcal.fits'

# Ouverture du fichier à l'aide d'astropy  
field = fits.open(filename)   
print "Ouverture du fichier : " + str(filename)       

# Lecture des données fits
tbdata = field[1].data   
print "Lecture des données du fits"            

                ###############################
                # Application du tri sur PROB #
                ###############################

mask = np.bitwise_and(tbdata['PROB'] < 1.1, tbdata['PROB'] > -0.1)  
new_tbdata = tbdata[mask]   
print "Création du Masque"       

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

# Détermination de RA_max et RA_min 
RA_max = np.max(new_tbdata['RA'])
RA_min = np.min(new_tbdata['RA'])
print "RA_max vaut :     " + str(RA_max)
print "RA_min vaut :     " + str(RA_min)

# Détermination de DEC_max et DEC_min   
DEC_max = np.max(new_tbdata['DEC'])
DEC_min = np.min(new_tbdata['DEC'])
print "DEC_max vaut :   " + str(DEC_max)
print "DEC_min vaut :   " + str(DEC_min)

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

# Détermination de RA_moyen et DEC_moyen
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 " ------------------------------- "
print " "

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


# Creation du tableau
new_col_data_X = array = (new_tbdata['RA'] - RA_central) * np.cos(DEC_central)
new_col_data_Y = array = new_tbdata['DEC'] - DEC_central
print 'Création du tableau'


# Creation des nouvelles colonnes
col_X = fits.Column(name='X', format='D', array=new_col_data_X)
col_Y = fits.Column(name='Y', format='D', array=new_col_data_Y)
print 'Création des nouvelles colonnes X et Y'


# Creation de la nouvelle table
tbdata_final = fits.BinTableHDU.from_columns(new_tbdata.columns + col_X + col_Y)

# Ecriture du fichier de sortie .fits
tbdata_final.writeto('{}_{}'.format(filename,'mask'))
print 'Ecriture du nouveau fichier mask'

field.close()
你知道这个过程是如何进行的吗? 我怎样才能把我的地块切成小块

谢谢大家!! 更新:

在armatita给出答案后,我更新了我的脚本:

###################################################
###################################################
###################################################

filename = '/home/valentin/Desktop/Field52_combined_final_roughcal.fits_mask'

print 'Fichier en cours de traitement' + str(filename) + '\n'

# Opening file with astropy
field = fits.open(filename)         

# fits data reading 
tbdata = field[1].data    

##### BUILDING A GRID FOR THE DATA ########
nodesx,nodesy = 360,360   # PIXELS IN X, PIXELS IN Y
firstx,firsty = np.min(tbdata['X']),np.min(tbdata['Y'])
sizex = (np.max(tbdata['X'])-np.min(tbdata['X']))/nodesx
sizey = (np.max(tbdata['Y'])-np.min(tbdata['Y']))/nodesy
grid = np.zeros((nodesx+1,nodesy+1),dtype='bool') # PLUS 1 TO ENSURE ALL DATA IS INSIDE GRID

# CALCULATING GRID COORDINATES OF DATA
indx = np.int_((tbdata['X']-firstx)/sizex)
indy = np.int_((tbdata['Y']-firsty)/sizey)
grid[indx,indy] = True  # WHERE DATA EXISTS SET TRUE

# PLOT MY FINAL IMAGE
plt.imshow(grid.T,origin='lower',cmap='binary',interpolation='nearest')
plt.show()
我发现这个情节:


因此,当我使用箱子大小时,我可以看到或多或少的空白,指示像素中是否有对象:)

这通常是一个将数据插入网格(像素或节点)的过程。以下示例构建栅格(二维阵列)并计算示例数据的“栅格坐标”。一旦它有了这些网格坐标(真的只是数组索引),您就可以将这些元素设置为真。检查以下示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(0,1,1000)
y = np.random.normal(0,1,1000)

##### BUILDING A GRID FOR THE DATA ########
nodesx,nodesy = 100,100   # PIXELS IN X, PIXELS IN Y
firstx,firsty = x.min(),y.min()
sizex = (x.max()-x.min())/nodesx
sizey = (y.max()-y.min())/nodesy
grid = np.zeros((nodesx+1,nodesy+1),dtype='bool') # PLUS 1 TO ENSURE ALL DATA IS INSIDE GRID

# CALCULATING GRID COORDINATES OF DATA
indx = np.int_((x-firstx)/sizex)
indy = np.int_((y-firsty)/sizey)
grid[indx,indy] = True  # WHERE DATA EXISTS SET TRUE

# PLOT MY FINAL IMAGE
plt.imshow(grid.T,origin='lower',cmap='binary',interpolation='nearest')
plt.show()
,其结果是:

注意,我正在用imshow显示一个图像。我是否应该减少得到的像素数(20,20=nodesx,nodesy):


也可以考虑在MatPultLIB中更自动的情节。

谢谢你的回答!稍后我将尝试几次:)
import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(0,1,1000)
y = np.random.normal(0,1,1000)

##### BUILDING A GRID FOR THE DATA ########
nodesx,nodesy = 100,100   # PIXELS IN X, PIXELS IN Y
firstx,firsty = x.min(),y.min()
sizex = (x.max()-x.min())/nodesx
sizey = (y.max()-y.min())/nodesy
grid = np.zeros((nodesx+1,nodesy+1),dtype='bool') # PLUS 1 TO ENSURE ALL DATA IS INSIDE GRID

# CALCULATING GRID COORDINATES OF DATA
indx = np.int_((x-firstx)/sizex)
indy = np.int_((y-firsty)/sizey)
grid[indx,indy] = True  # WHERE DATA EXISTS SET TRUE

# PLOT MY FINAL IMAGE
plt.imshow(grid.T,origin='lower',cmap='binary',interpolation='nearest')
plt.show()